number_in_month练习(在SML中获得EQUAL。OP错误,一个功能不能正常工作,其他功能则不行)

问题描述 投票:0回答:2

(*写一个带有列表的函数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
2个回答
1
投票

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


0
投票

答案:忘记了=号。这是正确的:

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)
© www.soinside.com 2019 - 2024. All rights reserved.