我正在尝试使用以下实现来反转SML中的列表
fun reverse x y =
case x of
[] => y
| x::xs => reverse(xs, x::y)
;
我收到的错误消息是不可穿透的:
trial.sml:1.6-4.35 Error: case object and rules don't agree [tycon mismatch]
rule domain: 'Z list * 'Z list
object: ('Z list * 'Z list) * 'Y
in expression:
(case (arg,arg)
of (x,y) =>
(case x
of nil => y
| :: <pat> => reverse <exp>))
trial.sml:1.6-4.35 Error: right-hand-side of clause doesn't agree with function result type [tycon mismatch]
expression: 'Z -> _
result type: 'Y list
in declaration:
reverse = (fn arg => (fn <pat> => <exp>))
但是,如果我将签名更改为有趣的反向(x:&#39;列表,y:&#39;列表) 那么它的作用原因是什么呢?有没有办法写这个,所以我不需要写类型&#39;列表?
答案 0 :(得分:1)
x y
与(x,y)
不同。
在定义的第一行
fun reverse x y =
您似乎正在尝试编写类型
的 curried 函数fn: a' list -> a' list -> 'a list
但是在递归调用中
reverse(xs, x::y)
您正在对reverse
进行处理,就好像它是 uncurried 类型的函数
fn:a&#39;列表* a&#39;列表 - &gt; &#39;列表
问题与是否添加类型注释没有任何关系,而是与放置括号的位置(以及逗号,如果有的话)有关。根据您希望的类型,有两种有效的修复方法。由于这似乎是家庭作业(没有明显的非家庭作业的理由来避免内置的rev
),我将把详细信息留给你。