求助实现number_in_months函数:统计匹配指定月份列表的日期数
问题分析与解决方案
你的代码抛出uncaught exception EMPTY的直接原因是未处理月份列表为空的边界情况,同时递归逻辑的方向有误——你不需要逐个日期和单个月份匹配,应该复用已经实现并测试通过的number_in_month函数来拆分问题。
核心实现思路
number_in_months的需求是统计日期列表中属于任意指定月份的总数量,我们可以把这个问题拆解为:
- 如果月份列表为空,直接返回0(没有需要统计的月份)
- 如果月份列表非空,先调用
number_in_month统计当前第一个月份对应的日期数量,再递归处理剩余的月份列表,将两次结果相加即可。
正确代码实现
fun number_in_months (dates : (int * int * int) list, months : int list) = if null months then 0 else number_in_month(dates, hd months) + number_in_months(dates, tl months)
为什么你的原有代码会出错
你之前的逻辑只聚焦于日期列表的头部与月份列表的头部匹配,既没有处理“当前月份的所有日期检查完后切换到下一个月份”的场景,更关键的是完全忽略了月份列表被遍历完毕(为空)的情况——此时调用hd months就会触发EMPTY异常。
测试案例验证
用以下测试代码验证功能:
val test3 = number_in_months ([(2012,2,28),(2013,12,1),(2011,2,1)], [2,12]) = 3
运行后结果应为true,符合预期。
内容的提问来源于stack exchange,提问作者Mr. TAO
相关产品推荐
相关产品推荐

