0

我对 SML 很陌生,并以此做功课。“编写一个函数 number_in_month,它接受一个日期列表和一个月份(即一个 int)并返回列表中有多少个日期在给定月份中。”

这就是我解决的问题,看不出有什么问题。请帮忙。

`

    fun number_in_month (dates: (int*int*int) list,month:int) = 
    if ((#2 (hd dates)) = month)
    then val flag=1 flag+number_in_month(tl dates, month) 
    else number_in_month((tl dates),month)`

REPL 告诉我们:用 EQUALOP 替换 VAL。

4

4 回答 4

2

您不能“以这种方式”绑定变量。变量的绑定是一个声明,因此不能在需要表达式的地方完成。

在这种情况下,您必须使用 let-in-end 表达式

fun foo x = 
  let 
    val a = 42 
  in 
    a*x
  end 
于 2013-01-19T03:29:00.047 回答
1

你的问题是无休止的递归。编译器无法摆脱它,因为独立于结果 if..then..else 你再次运行你的函数试试这个:

fun number_in_month (dates: (int*int*int) list,month:int) = 
    if null dates
    then 0
    else if ((#2 (hd dates)) = month)
    then val flag=1 flag+number_in_month(tl dates, month) 
    else number_in_month((tl dates),month)
于 2013-01-23T18:46:06.687 回答
1

我试图自己修复它,这就是我的解决方案:

fun number_in_month (dias: (int*int*int) list,mes:int) = if null dias then 0 else if ((#2 (hd dias)) = mes) then let val flag = 1 + number_in_month(tl dias, mes) in flag end else number_in_month((tl dias),mes)

我希望你也可以使用它!

于 2013-01-24T16:55:15.410 回答
0

REPL 的错误消息令人困惑,但 Jesper 是正确的,如果您需要函数中的赋值语句,您应该使用 let-in-end 表达式。这肯定会让你解决这个错误。

于 2013-01-19T14:21:54.593 回答