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中?不,这只是一个例子。是的,这毫无意义。