2013-03-01 95 views
3

我真的被Haskell中的函數類型困住了。有兩種功能的類型,我不能解釋這些之間的真正區別。類似的括號化函數類型之間的區別

a :: Int -> (Int -> (Int -> (Int -> Int))) 

b :: (((Int -> Int) -> Int) -> Int) -> Int 

我還是不明白這一點。我知道currying的目的是什麼 - 但我看不出在這個例子中捲曲的概念!

函數a:傳入一個Int,結果是另一個需要Int ...等等。

功能b:這與功能A有什麼不同?

回答

7

也許是做的最好的事情就是想約兩簡單的功能:

f :: a -> (b -> c) 
g :: (a -> b) -> c 

讓我們來看看這些功能反過來。

第一個函數f採用類型爲a的單個參數,並返回類型爲b -> c的函數。換句話說,你可以寫類似於以下,假設x :: ay :: b,並z :: c

f :: a -> (b -> c) 
f x = f' 
    where f' :: b -> C 
     f' y = z 

另一種方式來寫的f簽名是:

f :: a -> b -> c 

這在默認情況下工作,因爲我們將->綁定到右側。它也給了我們另一種理解f的等效方式:它可以被認爲是一個函數,它帶有兩個參數,類型爲ab,併產生c類型的結果。

第二個函數g帶有一個參數,它是類型爲a -> b的函數。

g :: (a -> b) -> c 
g h = z 
    where h :: a -> b 

因此這兩者是非常不同的。

將此應用於您的函數,第一個函數需要4個值類型爲Int並返回Int。第二個函數採用類型爲((Int -> Int) -> Int) -> Int的單個函數,並且這是一個函數,其採用類型爲(Int -> Int)的第三個函數,並生成Int,依此類推。

3

函數b將函數作爲參數 - 它不會生成函數作爲其結果。這是一個很大的區別:

a 42將產生一個函數,其他參數。 b 42將產生類型錯誤,因爲42不是函數。 b myfun其中myfun有類型((Int -> Int) -> Int) -> Int)將產生一個Inta myfun將導致類型錯誤,因爲myfun不是整數。

相關問題