为什么我的 SML 程序中得到 "unbound variable or constructor"

Why am I getting "unbound variable or constructor" in my SML program

我已经编写了一个方法 return 列表中满足函数(通过柯里化传入)的第一个元素。函数 returns NONE 或 SOME 取决于元素是否满足条件。我正在使用模式匹配 但是,我遇到了可怕的错误: 错误:未绑定变量或构造函数:my_function

我是 SML 的新手,我发现最困难的事情之一就是理解错误消息。从以前的消息经验来看,我认为问题是 my_function 从来没有 returns,但我在这里看不出逻辑问题。有人可以快速看一下并告诉我问题所在吗?问题是我在没有满足输入函数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

谢谢,戴夫

如果你用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 *)