SML:类型推断在将项目附加到列表时给出奇怪的错误
SML: Type inference giving strange error whilst appending an item to a list
我正在尝试使用以下实现反转 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>))
但是,如果我将签名更改为 fun reverse(x: 'a list, y: 'a list)
那么它有效为什么会这样?有没有办法写这个,这样我就不需要写类型 'a list ?
x y
不同于 (x,y)
。
在定义的第一行
fun reverse x y =
您似乎正在尝试编写 curried 类型的函数
fn: a' list -> a' list -> 'a list
但是在递归调用中
reverse(xs, x::y)
您正在将 reverse
视为 uncurried 类型
的函数
fn: a'列表*a'列表->'a列表
问题与您是否添加类型注释完全无关,而是与您放置括号(和逗号,如果有的话)的位置有关。根据您希望的类型,有两个有效的修复。由于这似乎是作业(没有明显的non-homework理由来避免built-inrev
),我会把细节留给你。
我正在尝试使用以下实现反转 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>))
但是,如果我将签名更改为 fun reverse(x: 'a list, y: 'a list) 那么它有效为什么会这样?有没有办法写这个,这样我就不需要写类型 'a list ?
x y
不同于 (x,y)
。
在定义的第一行
fun reverse x y =
您似乎正在尝试编写 curried 类型的函数
fn: a' list -> a' list -> 'a list
但是在递归调用中
reverse(xs, x::y)
您正在将 reverse
视为 uncurried 类型
fn: a'列表*a'列表->'a列表
问题与您是否添加类型注释完全无关,而是与您放置括号(和逗号,如果有的话)的位置有关。根据您希望的类型,有两个有效的修复。由于这似乎是作业(没有明显的non-homework理由来避免built-inrev
),我会把细节留给你。