2014-06-13 22 views
2

我想了解無點式的概念。我做了一個函數嘗試使用uncurry添加兩個值。在Haskell中使用咖喱點式自由風格的聲明問題

add = (+) . uncurry 

,結果抱怨:

No instance for (Num ((a0, b0) -> c0)) 
    arising from a use of `+' 
Possible fix: 
    add an instance declaration for (Num ((a0, b0) -> c0)) 
In the first argument of `(.)', namely `(+)' 
In the expression: (+) . uncurry 
In an equation for `add': add = (+) . uncurry 

這是一個聲明的問題?我試過add :: (Int, Int) -> Int,它不起作用。

+2

嘗試鍵入:T(+)',':噸uncurry',' :t((+)。uncurry)'和':t(uncurry。(+))'。然後':t(uncurry +)'。 – Mephy

+0

答案會告訴你你需要做什麼來解決你的問題,但我更關心你使用'(+)的理由。 uncurry'。你是否期望'uncurry'採取一對並返回兩個值,將這些值傳遞給'(+)'? –

+0

我想我很困惑if(+)被視爲一個函數。我認爲它應該作爲uncurry的一個參數來傳遞。 – Fizzzz

回答

5

你應該通過(+)uncurry

add :: (Int, Int) -> Int 
add = uncurry (+) 

這是因爲uncurry是取一個二元函數,並返回一個一元函數的函數:

uncurry :: (a -> b -> c) -> ((a, b) -> c) 

你的二元函數是(+)這需要兩個Num s並總結它們。因此uncurry (+)將轉變成(+)

(Num, Num) -> Num 

其然後由add類型簽名受到以下限制:在GHCI`

(Int, Int) -> Int 
+0

嚴格地說,'a - > b - > c'是一個一元函數,它接受一個類型爲'a'的值並返回類型爲'b - > c'的值。 – user2407038

+0

這解決了這個問題。謝謝 :)。我認爲(+)是一個應該是論點的函數。 – Fizzzz