我是新來的Haskell和函數式編程,我無法弄清楚爲什麼哈斯克爾 - 找出型簽名
T2 =(\ XYZA類型簽名 - >((XY) Z,(YX)Z))
看起來像這樣:
T2 ::(A - >一) - >(A - >一) - >甲 - >乙 - >( a,a)
你能告訴我它是如何工作的嗎?
問候
我是新來的Haskell和函數式編程,我無法弄清楚爲什麼哈斯克爾 - 找出型簽名
T2 =(\ XYZA類型簽名 - >((XY) Z,(YX)Z))
看起來像這樣:
T2 ::(A - >一) - >(A - >一) - >甲 - >乙 - >( a,a)
你能告訴我它是如何工作的嗎?
問候
(.)
是合成功能和它的類型是
(.) :: (b -> c) -> (a -> b) -> (a -> c)
所以,我們知道,因爲你正在撰寫x
和y
,他們必須功能,並有類型這樣的:
x :: a -> b
y :: a' -> b'
請注意,當您編寫兩個函數時,右側函數的輸出類型必須與左側函數的輸入類型匹配。因此,當你做x . y
時,我們可以推斷b'
和a
是同一類型。同樣,我們可以推斷a'
和b
是相同的類型。這給了我們如下:
(y . x) :: a -> a
(x . y) :: b -> b
但是,那你說幹就幹,應用這兩個函數來z
,這意味着a
和b
必須是同一類型,z
即類型,所以我們可以進一步推斷
(y . x) :: a -> a
(x . y) :: a -> a
z :: a
最後,變量a
就是這樣實際上並不在函數的定義中使用的虛擬變量,所以它得到了不同類型的變量。
謝謝...我認爲現在很清楚;) – pichlbaer
從拉姆達我們可以看到,t2
需要4個參數x
,y
,z
和a
。然後它返回一個元組。 .
中是爲了組成。所以從這我們可以看到x
和y
都是函數,而不僅僅是值。然後我們看到我們有x . y
和y . x
這意味着返回類型x
必須是y
的參數類型,反之亦然。所以我們知道x
和y
必須具有相同的類型,因此a -> a
是它們的類型。因此x . y :: a -> a
和y . x :: a -> a
所以我們知道z
必須有類型a
。最後a
,該變量從不使用,因此它可以是任何類型,因爲我們無法從中找出更多。
謝謝...幫了我很多:) – pichlbaer
這實際上應該是關於語法和類型推斷的每個部分的許多單獨問題,您會發現混淆。 lambda表示法('\ a - > b')與函數應用程序('fx')和函數組合('x.y',它實際上只是一種函數應用程序)有區別,隨着讀取eta-reduced ('plus =(+)'vs'plus ab = a + b')。 –