2016-11-25 42 views
0

好吧,提前抱歉,這可能是重新發布,但我花了30分鐘搜索stackoverflow並找不到相似程度足以理解。基本上,我不明白爲什麼瞭解一個SML類型fn(f,g,x)=> g(f(x))或類似

fn (f,g,x) => g(f(x)) 

給出了從我的理解類型

(’a -> ’b)*(’b -> ’c)*’a -> ’c 

應該先從

'a * 'b * 'c... 

但是,這顯然是錯誤的。

在此先感謝。

回答

2

事實上,這一切都始於'a * 'b * 'c,其中f : 'ag : 'bx : 'c但隨後的類型推斷機制看到該f施加x,所以 所以結論是,函數f : 'd -> 'e(即'b = 'd -> 'e)。此外,x的類型必須符合f的輸入類型,因此'd = 'cf : 'c -> 'e

此外,g是一個函數一樣,所以'b = 'y -> 'z,很容易地看到,f的輸出類型必須等於g的輸入類型,這爲我們提供了以下類型方程'y = 'e

我們有x : 'c,f : 'c -> 'e,g : 'e -> 'z。具體變量名稱並不重要,我們可以像這樣重命名它們:

'c -> 'a 
'e -> 'b 
'z -> 'c 

這讓作爲x : 'af : 'a -> 'bg : 'b -> 'c

由於fn (f,g,x)需要三倍作爲其輸入,它必須有類型

<type of f> * <type of g> * <type of x> -> <output type of g> 

擴大上述半正式的描述中,我們得到

('a -> 'b) * ('b -> 'c) * a' -> 'c 
+0

謝謝!非常感謝它。 – fdbdcbc

相關問題