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

为什么我会得到;“未绑定变量或构造函数”;在我的SML程序中,sml,smlnj,Sml,Smlnj,我已经编写了一个方法来返回满足函数(通过currying传入)的列表中的第一个元素。该函数根据元素是否满足条件返回NONE或SOME。我正在使用模式匹配 然而,我得到了一个可怕的错误: 错误:未绑定变量或构造函数:my_函数 我是SML的新手,我发现最难的事情之一是理解错误消息。根据以前对消息的经验,我认为问题在于我的_函数永远不会返回,但我很难看到这里的逻辑问题。有人能快速看一下并告诉我这个问题吗?问题是当没有满足输入函数f的元素时,我引发了一个错误吗 我对什么是错误感兴趣,也许更重要的是,当

我已经编写了一个方法来返回满足函数(通过currying传入)的列表中的第一个元素。该函数根据元素是否满足条件返回NONE或SOME。我正在使用模式匹配 然而,我得到了一个可怕的错误: 错误:未绑定变量或构造函数:my_函数

我是SML的新手,我发现最难的事情之一是理解错误消息。根据以前对消息的经验,我认为问题在于我的_函数永远不会返回,但我很难看到这里的逻辑问题。有人能快速看一下并告诉我这个问题吗?问题是当没有满足输入函数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 my_function=fn f=>fn lst=>(*注意当前*)
第1宗
[]=>升起无应答(*到达这里在lst saf中什么都不是
|x::xs=>无的情况f(x)=>(my_函数f xs)
|一些y=>x
val test=my_函数(fn x=>如果x<3,则某些x没有)[1,2,3,4]=2

谢谢,Dave

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

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

感谢您的快速回复。我不知道有关val的情况,也不知道无法递归调用。我将val替换为fun并获得错误:错误:在子句中找不到函数参数,错误:子句的右侧与函数结果类型不一致[tycon失配].也许我现在真的有一个逻辑错误。我会查一查的。是“提高无答案”引发问题?方法是从列表中返回第一个元素,以验证函数f,否则将引发异常。您不能返回异常吗?如果使用
fun
而不是
val rec
,则必须编写
fun my_函数f lst=…
而不是
fun my_函数=fn f=>fn lst=>。
Wow!WWorks。谢谢!标记为答案。但是如果你有第二个…你怎么能从错误描述中说出问题是什么?第一个错误“未绑定构造函数…”并不是真的建议“不能使用val进行递归”。第二个错误“子句的右侧…”并不是说你不能使用fn f=>fn lst。同样,我发现对错误的解释是ML最困难的事情。再次感谢。提供了接收错误消息的示例。对于第二个错误,更相关的消息是“在子句中找不到函数参数”。感谢您的快速回复。我不知道有关val的情况,也不知道无法递归调用。我将val替换为fun并获取错误:错误:在子句中找不到函数参数,错误:子句的右侧与函数结果类型不一致[tycon失配].也许我现在真的有一个逻辑错误。我会查一查的。是“提高无答案”引发问题?方法是从列表中返回第一个元素,以验证函数f,否则将引发异常。您不能返回异常吗?如果使用
fun
而不是
val rec
,则必须编写
fun my_函数f lst=…
而不是
fun my_函数=fn f=>fn lst=>。
Wow!WWorks。谢谢!标记为答案。但是如果你有第二个…你怎么能从错误描述中说出问题是什么?第一个错误“未绑定构造函数…”并不是真的建议“不能使用val进行递归”。第二个错误“子句的右侧…”并不是说你不能使用fn f=>fn lst。同样,我发现对错误的解释是ML最困难的事情。再次感谢。提供了接收错误消息的示例。对于第二个错误,更相关的消息是“在子句中找不到函数参数”。