SML中如何对比查找列表内元组元素并统计匹配次数
问题修复方案
错误原因
- 函数参数定义与调用不匹配:你定义的
number_in_months需要4个入参,但实际调用仅传入2个参数,直接触发类型不匹配报错,多余的months2、months3参数无实际作用可删除 - 无遍历逻辑:当前代码仅比对了第二个元组的第二个元素和搜索列表第一个元素,未实现全量元组遍历、全量搜索值匹配的需求
- 缺少存在性校验逻辑:没有通用的「判断元素是否在列表中」的实现,无法完成多值匹配校验
可运行实现代码
(* 辅助工具:判断指定int值是否存在于目标列表中 *) fun is_in (target : int, check_list : int list) = if null check_list then false else if hd check_list = target then true else is_in(target, tl check_list) (* 核心函数:统计所有符合月份匹配要求的元组总数 *) fun number_in_months(dates : (int * int * int) list, searchingElements : int list) = if null dates then 0 else let val current_month = #2 (hd dates) val add_count = if is_in(current_month, searchingElements) then 1 else 0 in add_count + number_in_months(tl dates, searchingElements) end (* 测试用例,运行后返回值为true代表逻辑正确 *) val test3 = number_in_months ([(2012, 2, 28), (2013, 12, 1), (2011, 3, 31), (2011, 4, 28)], [2, 3, 4]) = 3
实现说明
- 采用递归实现列表遍历,不需要额外引入循环语法,符合Standard ML的函数式编码习惯
- 边界条件做了兜底:日期列表为空时直接返回0,避免空列表执行
hd/tl操作触发运行时错误 - 测试用例运行后
test3的取值为true,符合预期要求
内容的提问来源于stack exchange,提问作者Mostafa Ezzat
相关产品推荐
相关产品推荐

