【发布时间】:2015-07-23 01:09:36
【问题描述】:
我正在尝试在 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 说它需要一个整数列表,但我只给它一对整数列表?
我在这里有点迷路,所以任何帮助将不胜感激。
谢谢, 布莱曼
【问题讨论】:
-
第一个case是
flipAlternate([]) = [],由此我们可以推断出它的类型一定是'a list -> 'a list。第二种情况是flipAlternate([x]) = x,由此我们可以推断出它的类型也必须是'a list -> 'a。仅当 'a 设置为 'a list 时两者都为真,但它还必须具有类型 'a list list -> 'a list。这会导致无限回归,但 SML 的类型统一器早在此之前就抱怨过,因为不允许使用此类类型。
标签: functional-programming sml