1

考虑以下代码:

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)

我无法理解这里的问题:g(a)return h,但我在声明中没有看到任何特定的返回值fun g(a)(即没有什么类似 fun g(a):int的),那么为什么会出现错误?

谢谢

4

2 回答 2

3

因为g只有一个参数,所以它有 type 'X -> 'Y

h(b) = g(a)意味着hg必须有相同的结果类型'Y
并且h有类型'Z -> 'Y

因此,g(x)对于任何类型的 x 'X,必须具有类型'Y。但是is
的返回值,它有 type 。 这意味着必须与 相同,这是不可能的。g(x)h'Z -> 'Y
'Y'Z -> 'Y

正如 SML 所说,'Z -> 'Y(的类型h)不同意'Y(的类型g(a))。

如果您尝试手动解决,您会发现

g 1 

将是一个函数h,使得

h 3

是的价值

g 1

这是一个功能h......

等等,无限期地。

于 2013-02-21T22:07:47.630 回答
1

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

这一次你的闭包只有一个主体。但这没有任何意义......只是一个为什么你会得到循环错误的例子。

于 2013-02-21T22:09:23.197 回答