首页 > 解决方案 > number_in_month 练习(获得 EQUAL。SML 中的 OP 错误,一个功能起作用,其他不起作用)

问题描述

(* 编写一个函数 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

标签: sml

解决方案


“语法错误:插入 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 在您忘记一个案例时通知您,例如空列表的案例(您忘记了)。


推荐阅读