当一切看起来都是正确的时候,SML得到一个未绑定的变量或构造函数错误



我正在尝试找出相互递归。我有这个代码:

fun take(L)=
if L=nil then nil
else hd(L) :: skip(tl(L))
AND
fun skip(L)=
if L=nil then nil
else take(tl(L));

但它给了我这些错误:

stdIn:54.14-54.18 Error: unbound variable or constructor: skip
stdIn:55.1-55.4 Error: unbound variable or constructor: AND

我做错了什么?

您的直接错误是因为标准ML区分大小写,并且它的所有保留字都是小写的;所以你需要写and而不是AND

此外,fun引入了一个完整的声明,而不是单独的绑定,这意味着您需要删除and之后的额外fun

最后,您的函数目前要求列表具有相等类型(如int liststring list(,这可能不会破坏交易,但考虑到函数的实际功能,它们确实没有理由不支持real list等非相等类型。要实现这一点,您应该将参数与模式nil进行匹配,而不是测试参数是否等于nil。(一般来说,您应该在更多的地方使用模式匹配;您没有理由调用hdtl。(

把它放在一起:

fun take nil = nil
| take (h::t) = h :: skip t
and skip nil = nil
| skip (h::t) = take t

最新更新