为什么我得到"未绑定的变量或构造函数"在我的SML程序中

时间:2017-07-05 17:21:36

标签: sml smlnj

我编写了一个方法来返回满足函数的列表中的第一个元素(通过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

谢谢,戴夫

1 个答案:

答案 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 *)