2014-11-01 60 views
1

新哈斯克爾括號之內,我感覺就像:t缺少括號內爲我正確地理解函數類型缺乏在解釋哈斯克爾功能型

像這樣的:

Prelude> :info flip 
flip :: (a -> b -> c) -> b -> a -> c -- Defined in ‘GHC.Base’ 

我可以說:flip正在一個功能,並通過包圍這樣返回另一個功能:

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

或者我可以說flip爲t亞慶一個功能和ba並返回元素c

對於相當多的功能類型我有這種感覺,我想一定是有規則來消除這種不確定性

+0

你的問題到底是什麼? – 2014-11-01 05:46:08

回答

6

其實,這不是一個歧義,這是一個功能!

以加號運算符(+)爲例。它有型號

(+)::Num a=>a->a->a 

你可以把它看作一個函數,它需要兩個數字,並返回三分之一。

number 
     \ 
      ----> number 
    /
number 

您可以使用這個喜歡這 -

(+) 1 2 (-- evaluates to 3) 
or 
1 + 2 (-- evaluates to 3) 

,你可以使用它作爲

(+)::Num a=>a->(a->a) 

這需要一個號碼,並輸出一個全功能,其域名和範圍是每個數字,即Num a=>a->a

number ------> <function> 

例如

(+) 1 (-- evaluates to incrementorFunc) 
....also written as (+ 1) 

其中incrementorFunc是添加一個到多個(即incrementorFunc = \x -> 1+x)的功能。

你現在可以傳遞這個函數來在代碼中的其他地方使用。

這種對偶性固有地嵌入到所有函數中,因此在類型描述中不需要使用括號。這個功能是哈斯克爾最大的優勢之一。

+0

不確定你的意思是'Num a =>(a-> a) - > a'。你的意思是'Num a =>(a,a) - > a',它的排序是... – luqui 2014-11-01 05:17:26

+0

@ luqui-你是對的,我很蠢....你對我的意思是正確的。給我幾秒鐘,我會重新說明這部分內容。 – jamshidh 2014-11-01 05:24:49

2

您不需要括號,因爲兩者沒有區別。

純粹主義者會說,所有的Haskell函數都只需要一個參數。沒有多重參數功能。例如:

(map f) [1..10] 

map施加參數f並將結果施加參數[1..10]

map f [1..10] 

作爲被解釋。

這個解釋是在Haskell中自動進行卷曲工作的原因。從某種意義上說,咖喱是哈斯克爾的一種幻覺 - 也就是我們看到map f,並且由於只有一個參數,我們看到的咖喱形式爲map。實際上,map只需要一個參數,因此map f已被完全應用。