2

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

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

该代码旨在计算列表中该月份的日期出现次数

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

知道我做错了什么吗?

4

2 回答 2

10

您的第二个模式匹配试图匹配单个日期(_,y,_),但它正在与您的日期列表匹配。尝试使用匹配(_,y,_)::_

更惯用的是匹配 using(_,y,_)::tail和 to usetail而不是dates.Tail在表达式的后面。

于 2013-06-20T13:45:27.960 回答
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

于 2013-06-21T07:37:22.617 回答