SML在一切正常时出现未绑定变量或构造函数错误

SML在一切正常时出现未绑定变量或构造函数错误,sml,ml,Sml,Ml,我试图找出相互递归。我有以下代码: 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:

我试图找出相互递归。我有以下代码:

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区分大小写,所有保留字都是小写的;因此,您需要编写
,而不是

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

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

综合起来:

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

试着这么做,我所做的只是更改和改,然后得到了这些错误
stdIn:125.1-126.9错误:语法错误:删除和乐趣ID stdIn:127.2-127.6错误:语法错误:删除IF ID stdIn:127.11错误:语法错误找到了
@h2oBoost:是的,对不起,我只解决了问题中的错误。我现在扩展了答案,解释了代码中的一些其他问题(以及如何解决这些问题)。@h2oBoost:关于相等类型的部分:如果您注意到,您的函数有类型
“列表->”列表
,而@ruakh的函数有类型
“列表->”列表
。完全没有必要要求输入列表元素具有相等类型,但需要说明的另一点是:当您执行
xs=ys
以查看两个元素是否相等时,这会引发对两个结构的深入遍历
xs
ys
;当然,这在这里不是问题,因为您正在与
[]
进行比较,而这种深度遍历毕竟没有那么深。但是,如果你能用更少的钱做事情,就不要习惯于比较