基本的f#错误模式匹配意味着错误的类型

基本的f#错误模式匹配意味着错误的类型,f#,F#,以下代码采用2个参数。第一个是三元组列表:三元组(d,m,y)表示日期 第二个是一个整数,即一个月 该代码用于统计列表中该月的日期出现次数 p、 我想这可能看起来像是一个家庭作业问题——不是。这是我今年早些时候在ML上的一门课,我正在尝试用f#重做所有的练习。所以这只是为了我的利益 let rec number_in_month (dates : (int * int * int) list, month) = match dates with | [] -> 0

以下代码采用2个参数。第一个是三元组列表:三元组(d,m,y)表示日期

第二个是一个整数,即一个月

该代码用于统计列表中该月的日期出现次数

p、 我想这可能看起来像是一个家庭作业问题——不是。这是我今年早些时候在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


你知道我做错了什么吗?

你的第二个模式匹配是试图匹配一个日期
(\uy,\uu)
,但它正在与你的日期列表匹配。尝试使用
(\uy,y)::\u
进行匹配


更惯用的用法是使用
(u,y,u)匹配:tail
,并在表达式后面使用
tail
而不是
日期。tail

也可以收紧代码(包括建议的修复标记)。注意类型推断的使用,这样就不需要传递日期的类型

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

实际上,在网上输入列表没有任何价值,是吗?你能不能让它成为
(日期:('a*'b*'c)列表
?如果我这样做,我会得到一个类似的错误:这个表达式应该有类型('a*'b*'c)但是这里的列表有类型'd*'e*'fah-当然-这很有意义,现在你指出它-谢谢。而且-我怀疑我定义的参数不正确?如果我把它们放在括号中,它们是元组,对吗?作为常规的curry函数,正确的做法是什么?只使用空格而不是括号\逗号。