(*写一个带有列表的函数number_in_month日期和一个月(即int)的和返回给定月份列表中的日期。*)
fun number_in_month(datelist : (int*int*int) list, month : int) =
if null(tl (datelist))
then if #2(hd (datelist)) = month then 1 else 0
else if #2(hd (datelist)) = month
then 1 + number_in_month(tl datelist, month)
else number_in_month(tl datelist, month)
(*写一个函数number_in_months,它需要一个日期列表和一个月列表(即int列表),并返回日期列表中的日期数在月份列表中的任何月份中。假设月份列表没有重复的数字。提示:对上一个问题使用答案。 *)
fun number_in_months(datelist : (int*int*int) list, monthlist : int list)
if null(tl (monthlist))
then number_in_month(datelist, hd monthlist)
else number_in_month(datelist, hd monthlist)
+ number_in_months(datelist, tl monthlist)
第二个函数在尝试编译时给我这个错误:
hw1.sml:42.5 Error: syntax error: inserting EQUALOP
[unexpected exception: Compile]
uncaught exception Compile [Compile: "syntax error"]
raised at: ../compiler/Parse/main/smlfile.sml:19.24-19.46
../compiler/TopLevel/interact/evalloop.sml:45.54
../compiler/TopLevel/interact/evalloop.sml:306.20-306.23
../compiler/TopLevel/interact/interact.sml:65.13-65.16
“语法错误:插入EQUALOP”表示SML需要=
字符。
来自SML / NJ的错误消息是过去20年来没有改善的事情之一。他们经常报告解析器所做的操作,以便尝试从错误中恢复,而不是错误可能是什么。
与条件匹配和选择器相比,使用模式匹配写列表递归(以及大多数其他内容)要好得多:
fun number_in_month ([], _) = 0
| number_in_month ((_, m, _)::ds, m') = (if m = m' then 1 else 0) + number_in_month(ds, m');
fun number_in_months (_, []) = 0
| number_in_months (ds, m::ms) = number_in_month(ds, m) + number_in_months(ds, ms);
[这也使SML在您忘记案例时通知您,例如,空列表的案例(您忘记了)。
答案:忘记了=号。这是正确的:
fun number_in_months(datelist : (int*int*int) list, monthlist : int list) =
if null(tl (monthlist))
then number_in_month(datelist, hd monthlist)
else number_in_month(datelist, hd monthlist)
+ number_in_months(datelist, tl monthlist)