【问题标题】:Standard ML: Operator and Operand Don't Agree (Circularity)标准 ML:运算符和操作数不同意(循环性)
【发布时间】: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


【解决方案1】:

你的第二种情况是错误的;你想要的

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

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

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

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

编辑:它知道第一种情况的结果是list,并得出结论认为参数比第二种情况的结果多一个list

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2017-06-28
    • 2017-11-03
    • 1970-01-01
    • 2019-09-11
    • 2021-02-07
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多