2014-06-13 1 views
2

point-free 스타일의 개념을 이해하려고합니다. 함수를 만들어 uncurry을 사용하여 두 개의 값을 추가하려고했습니다.하스켈에서 point-free 스타일의 카레 사용에 관한 선언 문제

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

시도 입력 : 다음에 add 형 서명으로 제한

(Num, Num) -> Num 

t (+)'': t의 uncurry'' : t ((+). uncurry)'와': t (uncurry. (+))'를 사용한다. 그러면': t (uncurry +)'. – Mephy

+0

답은 문제를 해결하기 위해해야 ​​할 일을 알려주지 만,'(+)를 사용하는 이유에 대해 더 관심이 있습니다. 괴롭다. 'uncurry'가 한 쌍을 가져 와서 두 개의 값을 반환하고, 그 값을'(+)'로 전달 했습니까? –

+0

if (+)를 함수로 간주하는 것을 혼란스럽게 생각합니다. 나는 그것이 uncurry에 대한 논쟁으로 전달되어야한다고 생각합니다. – Fizzzz

답변

5

당신은 통과해야 (+)uncurry에 :

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

uncurry는 단항 기능 바이너리 기능을 소요하고 반환하는 함수이기 때문이다 :

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

바이너리 기능이 소요 (+)이다가 두 Num s를 합산하여 합산합니다. 따라서 uncurry (+) 현황 (+) 변환한다`GHCi에

(Int, Int) -> Int 
+0

엄밀히 말하면, 'a -> b -> c'는 'a'유형의 값을 취하고 'b -> c'유형의 값을 반환하는 단항 함수입니다. – user2407038

+0

이렇게하면 문제가 해결됩니다. 고맙습니다 :). 나는 (+)가 인수가되어야하는 함수라고 생각했다. – Fizzzz