我有一个foo
定义如下的函数
fun foo x y = x (x (x y));
如何推断函数类型?
答案是:
val foo = fn : ('a -> 'a) -> 'a -> 'a
我有一个foo
定义如下的函数
fun foo x y = x (x (x y));
如何推断函数类型?
答案是:
val foo = fn : ('a -> 'a) -> 'a -> 'a
这个过程称为类型推断,由Hindley-Milner 算法在 SML 中完成。
首先让我们从泛型类型签名开始foo
:
val foo = fn : 'c -> 'b -> 'a
where x
has type'c
和y
has type 'b
。
我们有以下步骤:
x y
是函数应用,x
应该有签名'b -> 'd
,我们有一个方程'c = 'b -> 'd
并且x y
有类型'd
。x (x y)
意味着我们'b -> 'd
在参数类型'd
so '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