2014-03-02 37 views
0

我是新來的Haskell和函數式編程,我無法弄清楚爲什麼哈斯克爾 - 找出型簽名

T2 =(\ XYZA類型簽名 - >((XY) Z,(YX)Z))

看起來像這樣:

T2 ::(A - >一) - >(A - >一) - >甲 - >乙 - >( a,a)

你能告訴我它是如何工作的嗎?

問候

+1

這實際上應該是關於語法和類型推斷的每個部分的許多單獨問題,您會發現混淆。 lambda表示法('\ a - > b')與函數應用程序('fx')和函數組合('x.y',它實際上只是一種函數應用程序)有區別,隨着讀取eta-reduced ('plus =(+)'vs'plus ab = a + b')。 –

回答

7

(.)是合成功能和它的類型是

(.) :: (b -> c) -> (a -> b) -> (a -> c) 

所以,我們知道,因爲你正在撰寫xy,他們必須功能,並有類型這樣的:

x :: a -> b 
y :: a' -> b' 

請注意,當您編寫兩個函數時,右側函數的輸出類型必須與左側函數的輸入類型匹配。因此,當你做x . y時,我們可以推斷b'a是同一類型。同樣,我們可以推斷a'b是相同的類型。這給了我們如下:

(y . x) :: a -> a 
(x . y) :: b -> b 

但是,那你說幹就幹,應用這兩個函數來z,這意味着ab必須是同一類型,z即類型,所以我們可以進一步推斷

(y . x) :: a -> a 
(x . y) :: a -> a 
z :: a 

最後,變量a就是這樣實際上並不在函數的定義中使用的虛擬變量,所以它得到了不同類型的變量。

+0

謝謝...我認爲現在很清楚;) – pichlbaer

2

從拉姆達我們可以看到,t2需要4個參數xyza。然後它返回一個元組。 .中是爲了組成。所以從這我們可以看到xy都是函數,而不僅僅是值。然後我們看到我們有x . yy . x這意味着返回類型x必須是y的參數類型,反之亦然。所以我們知道xy必須具有相同的類型,因此a -> a是它們的類型。因此x . y :: a -> ay . x :: a -> a所以我們知道z必須有類型a。最後a,該變量從不使用,因此它可以是任何類型,因爲我們無法從中找出更多。

+0

謝謝...幫了我很多:) – pichlbaer