2013-07-08 5 views
9

Uczę się haskell i jestem nieco zdezorientowany, jak działa operator aplikacji curry.

Według GHC typ $ jest

*Main>:t ($) 
($) :: (a->b) -> a -> b 

Ale mogę wpisać następujący kod

*Main>map ($ 2) [(*2), (+2), (/2)] 
[4.0,4.0,1.0] 

Według podpisu $ chociaż Przypuszczam, że muszę używać klapki funkcja, ponieważ pierwszym parametrem dla $ jest (a-> b).

Na przykład, nie mogę wykonać następujące czynności

curry_test :: Integer -> String -> String 
curry_test x y = (show x) ++ " " ++ y 
*Main> let x = curry_test "123" 
    Couldn't match expected type `Integer' with actual type `[Char]' 
In the first argument of `curry_test', namely `"123"' 
In the expression: curry_test "123" 
In an equation for `x': x = curry_test "123" 

Ale mogę zrobić

let x = curry_test 2 
+0

Podpowiedź: '(*) :: Num a => a -> A -> A' – DiegoNolan

Odpowiedz

11

Infix operatorzy mają specjalne zasady. Zobacz tę stronę: http://www.haskell.org/haskellwiki/Section_of_an_infix_operator

Zasadniczo, ponieważ $ jest operatorem infix, ($ 2) rzeczywiście rozwiązuje 2 jako drugi argument $, więc jest to równoważne flip ($) 2.

Chodzi o to, aby częściowe stosowanie z operatorami było bardziej intuicyjne, więc na przykład, jeśli masz map (/ 2) nad listą, możesz sobie wyobrazić umieszczanie każdego elementu listy w "brakującym" miejscu po lewej stronie znaku podziału.

Jeśli chcesz korzystać z funkcji curry_test ten sposób, można zrobić

let x = (`curry_test` "123")