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

时间:2013-06-20 13:37:09

标签: f#

以下代码采用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

知道我做错了什么?

2 个答案:

答案 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