为什么我的 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 *)
我已经编写了一个方法 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 *)