我正在尝试找出相互递归。我有这个代码:
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 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