我编写了一个方法来返回满足函数的列表中的第一个元素(通过currying传递)。该函数返回NONE或SOME,具体取决于元素是否满足条件。我正在使用模式匹配 但是,我收到了可怕的错误: 错误:未绑定的变量或构造函数:my_function
我是SML的新手,我找到的最困难的事情之一是理解错误消息。根据以前的消息经验,我认为问题是my_function永远不会返回,但我在这里看到逻辑问题时遇到了麻烦。有人可以快速查看并告诉我这个问题吗?当没有元素满足输入函数f时,我是否会引发错误?
我对错误感兴趣,也许更重要的是,当你看到这种错误时,有什么办法可以获得更多信息吗?
val my_function = fn f => fn lst => (* Notice currying *)
case lst of
[] => raise NoAnswer (* Get here is nothing in lst saf
| x::xs => case f(x) of NONE => ( my_function f xs)
| SOME y => x
val test = my_function(fn x => if x < 3 then SOME x else NONE) [1,2,3,4] = 2
谢谢,戴夫
答案 0 :(得分:2)
如果使用val
关键字声明函数,则无法递归定义函数。因此,问题在于:
... NONE => ( my_function f xs) ...
您可以说通过在声明中添加rec
关键字来递归定义函数。
val rec my_function = fn f => fn list => ...
或者,fun
关键字是val rec
的语法糖。 fun
还包括用于讨论的好的语法糖:
fun my_function f lst = (* This is equivalent to your first line *)
有时您仍然只想使用val
关键字,而不是val rec
。例如,
val f = fn x => x + 3
val f = fn y => f y + 4 (* f here refers to the previous declaration of f *)