SML-错误:子句右侧与函数结果类型[循环性]不一致
考虑以下代码:SML-错误:子句右侧与函数结果类型[循环性]不一致,sml,smlnj,Sml,Smlnj,考虑以下代码: fun g(a) = let fun h(b)=g(a) in h end; 当我在SML中运行它时,我得到: - fun g(a) = = let fun h(b)=g(a) = in h end; stdIn:55.5-57.10 Error: right-hand-side of clause doesn't agree with function re sult type [circularity] expression: 'Z ->
fun g(a) =
let fun h(b)=g(a)
in h end;
当我在SML中运行它时,我得到:
- fun g(a) =
= let fun h(b)=g(a)
= in h end;
stdIn:55.5-57.10 Error: right-hand-side of clause doesn't agree with function re
sult type [circularity]
expression: 'Z -> 'Y
result type: 'Y
in declaration:
g = (fn a => let val <binding> in h end)
我不能理解这里的问题:ga返回h,但是
我在声明中没有看到任何特定的返回值,即
fun ga:int,为什么会出现错误
谢谢,因为g有一个参数,它的类型是'X->'Y
hb=ga意味着h和g必须具有相同的结果类型'Y,
h的类型为“Z->”Y
因此,对于'x'类型的任何x,gx必须具有'Y'类型。
但是gx的返回值是h,其类型为'Z->'Y。
这意味着“Y”必须与“Z->”Y的类型相同,这是不可能的
正如SML所说,“Z->”Y是h的类型,而“Y”是ga的类型
如果你试着手工计算,你会发现
g 1
函数h是这样的
h 3
价值是多少
g 1
这是一个函数h,这样
等等,无限期。因为g有一个参数,所以它的类型是'X->'Y
hb=ga意味着h和g必须具有相同的结果类型'Y,
h的类型为“Z->”Y
因此,对于'x'类型的任何x,gx必须具有'Y'类型。
但是gx的返回值是h,其类型为'Z->'Y。
这意味着“Y”必须与“Z->”Y的类型相同,这是不可能的
正如SML所说,“Z->”Y是h的类型,而“Y”是ga的类型
如果你试着手工计算,你会发现
g 1
函数h是这样的
h 3
价值是多少
g 1
这是一个函数h,这样
依此类推。ML类型推断系统首先将函数g识别为一个表达式,该表达式接受“Z”并返回“Y”。但随后它发现g的结果类型仅为“Y”,也是早期绑定h的结果类型。可以预期会看到Z->Z->Y类型的绑定。然而,函数闭包有一个自己的环境。就像这样绑定g
fun g a= g
如果你的闭包有一个同样是它自己的环境,那么ML类型推断无法猜测类型
您可以按如下方式声明这些函数
fun g(a) =
let
fun h(b)=g(a)
in
h(a)
end;
就像
fun g a = g a
这一次,你的结束只是一个身体本身。但这毫无意义……这只是一个为什么会出现循环错误的示例。ML类型推理系统首先将函数g识别为一个表达式,该表达式接受“Z”并返回“Y”。但随后它发现g的结果类型只是“Y”,也是早期绑定h的结果类型。可以预期会看到Z->Z->Y类型的绑定。然而,函数闭包有一个自己的环境。就像这样绑定g
fun g a= g
如果你的闭包有一个同样是它自己的环境,那么ML类型推断无法猜测类型
您可以按如下方式声明这些函数
fun g(a) =
let
fun h(b)=g(a)
in
h(a)
end;
就像
fun g a = g a
这一次,你的结束只是一个身体本身。但这毫无意义……这只是一个例子,说明为什么会出现循环错误。然后,你有一个函数,它承诺返回你想要的任何东西。但只有当它回来时……你同意上面的解释吗?如果你批评我对closuresno问题的理解,我会非常高兴。在这里,我完全同意你的看法,但我想补充一点,像g a=g a这样的函数没有任何意义——或者是在SML中?不,这只是一个例子。是的,这毫无意义。然后,你有一个函数,承诺返回你想要的任何东西。但只有当它回来时……你同意上面的解释吗?如果你批评我对closuresno问题的理解,我会非常高兴。在这里,我完全同意你的看法,但我想补充一点,像g a=g a这样的函数没有任何意义——或者是在SML中?不,这只是一个例子。是的,这毫无意义。