标准ML:运营商和操作员不同意(通告)

时间:2015-07-22 16:24:25

标签: functional-programming sml

我正在尝试用SML编写一个函数来翻转列表的替代元素。这是我的功能:

 fun flipAlternate(nil) = nil
     | flipAlternate([x]) = x
     | flipAlternate(x::y::xs) = y::x::flipAlternate(xs);

当我在交互式解释器中使用我的文件(Ullman.sml)时,我收到了这个编译错误:

- use "Ullman.sml";
[opening Ullman.sml]
Ullman.sml:5.31-5.54 Error: operator and operand don't agree [circularity]
  operator domain: 'Z list * 'Z list list
  operand:         'Z list * 'Z list
  in expression:
    x :: flipAlternate xs

所以SML说它需要一个整数列表列表,但我只给它一对整数列表?

我在这里有点失落所以任何帮助都会非常感激。

谢谢, bclayman

1 个答案:

答案 0 :(得分:4)

你的第二个案子是错的;你想要

fun flipAlternate(nil) = nil
 | flipAlternate([x]) = [x]
 | flipAlternate(x::y::xs) = y::x::flipAlternate(xs);

SML正在研究第二种情况并得出结论

flipAlternate :: 'z list list -> 'z list

与第三种情况下的递归不兼容。

编辑:它知道结果是第一种情况下的list,并且结论该参数比第二种情况的结果多一个list