How does function application with the $ operator curry in Haskell?

currying, haskell

Solution

Infix operators have special rules. See this page: http://www.haskell.org/haskellwiki/Section_of_an_infix_operator

Basically, since `$` is an infix operator, `($ 2)` actually fixes `2` as the second argument of `$`, so it is equivalent to `flip ($) 2`.

The idea is to make partial application with operators more intuitive, so for example if you `map (/ 2)` over a list, you can imagine putting each element of the list in the "missing" spot on the left side of the division sign.

If you want to use your `curry_test` function this way, you could do

let x = (`curry_test` "123")

Problem

I am learning haskell and am a little confused how the function application operator $ curry's. According to GHC the type of $ is ``` *Main>:t ($) ($) :: (a->b) -> a -> b ``` But I can type the following code ``` *Main>map ($ 2) [(*2), (+2), (/2)] [4.0,4.0,1.0] ``` According to the signature of $ though I would assume I would need to use the flip function because the first parameter to $ is (a->b). For example, I can't do the following ``` 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" ``` But I can do ``` let x = curry_test 2 ```

Original source