我的foo
函数定义如下
fun foo x y = x (x (x y));
如何推断出函数类型?
答案是:
val foo = fn : ('a -> 'a) -> 'a -> 'a
答案 0 :(得分:2)
此过程称为type inference,由Hindley–Milner algorithm在SML中完成。
首先让我们从foo
的通用类型签名开始:
val foo = fn : 'c -> 'b -> 'a
其中x
的类型为'c
,而y
的类型为'b
。
我们有以下步骤:
x y
是功能应用,x
应该有签名'b -> 'd
,我们有一个等式'c = 'b -> 'd
,x y
有'd
类型。< / LI>
x (x y)
表示我们在参数类型'b -> 'd
上应用函数类型'd
,因此'd = 'b
和'c = 'b -> 'b
。x (x (x y))
表示我们在参数类型'b -> 'b
上应用函数类型'b
并返回'a
(foo
的类型);它足以'b = 'a
。'c = 'a -> 'a and 'b = 'a
和foo
具有通用类型:val foo = fn : ('a -> 'a) -> 'a -> 'a