SML中的递归

时间:2013-01-18 23:49:37

标签: smlnj

我很喜欢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 个答案:

答案 0 :(得分:2)

你不能“那样”绑定变量。变量的绑定是一个声明,因此无法在需要表达式的地方完成。

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

fun foo x = 
  let 
    val a = 42 
  in 
    a*x
  end 

答案 1 :(得分:1)

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

有趣的number_in_month(dias:(int * int * int)list,mes:int)=     如果是空的dias     那么0     否则if((#2(hd dias))= mes)     然后让val flag = 1 + number_in_month(tl dias,mes)      在国旗      结束     else number_in_month((tl dias),mes)

我希望你也可以使用它!

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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)