以下代码采用2个参数。第一个是三元组列表:三元组(d,m,y)表示日期。
第二个是一个月的整数
该代码用于计算列表中该月份的日期出现次数
P.S。我想这可能看起来像是一个家庭作业问题 - 事实并非如此。这是我今年早些时候在ML中所做的一个课程,我正在尝试重做f#中的所有练习。所以这只是为了我的利益
let rec number_in_month (dates : (int * int * int) list, month) =
match dates with
| [] -> 0
| (_,y,_) when month = y -> 1 + number_in_month(dates.Tail, month)
| _ -> number_in_month(dates.Tail, month)
但它给出了错误:
预计此表达式具有类型 (int * int * int)列表但这里有类型 'a *'b *'c
知道我做错了什么?
答案 0 :(得分:10)
您的第二次模式匹配是尝试匹配单个日期(_,y,_)
,但它会与您的日期列表进行匹配。请尝试使用(_,y,_)::_
进行匹配。
更多惯用方法是使用(_,y,_)::tail
进行匹配,然后在表达式中使用tail
代替dates.Tail
。
答案 1 :(得分:1)
代码也可以收紧(包括修正的MarkP建议)。请注意使用类型推断,以便不需要传递dates
的类型
let rec number_in_month dates month =
match dates with
| [] -> 0
| (_,y,_)::tail ->
( number_in_month tail month) + (if y = month then 1 else 0)
let data = [(1,2,3);(1,2,3);(1,5,7);(1,9,2);(1,9,2);(1,9,2)]
number_in_month data 5
number_in_month data 2
http://www.tryfsharp.org/create/bradgonesurfing/datefinder.fsx