如何在SML中推导出函数类型

时间:2012-11-01 17:06:01

标签: sml

我的foo函数定义如下

fun foo x y = x (x (x y));

如何推断出函数类型?

答案是:

val foo = fn : ('a -> 'a) -> 'a -> 'a

1 个答案:

答案 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 -> 'dx y'd类型。< / LI>
  • x (x y)表示我们在参数类型'b -> 'd上应用函数类型'd,因此'd = 'b'c = 'b -> 'b
  • x (x (x y))表示我们在参数类型'b -> 'b上应用函数类型'b并返回'afoo的类型);它足以'b = 'a
  • 统一后,我们'c = 'a -> 'a and 'b = 'afoo具有通用类型:val foo = fn : ('a -> 'a) -> 'a -> 'a