0
我已經定義了一個foo
功能如下如何演繹功能型SML
fun foo x y = x (x (x y));
如何演繹函數類型?
答案是:
val foo = fn : ('a -> 'a) -> 'a -> 'a
我已經定義了一個foo
功能如下如何演繹功能型SML
fun foo x y = x (x (x y));
如何演繹函數類型?
答案是:
val foo = fn : ('a -> 'a) -> 'a -> 'a
這個過程被稱爲type inference這是在SML由Hindley–Milner algorithm完成。
首先讓我們先從一個泛型類型簽名foo
:
val foo = fn : 'c -> 'b -> 'a
其中x
的類型爲'c
和y
的類型是'b
。
我們有以下步驟:
x y
是功能應用,x
應該有簽名'b -> 'd
,我們有一個公式'c = 'b -> 'd
和x y
的類型是'd
。x (x y)
表示我們在參數類型'd
上應用函數類型'b -> '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