Reputation: 159
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
Upvotes: 9
Views: 378
Reputation: 2571
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")
Upvotes: 11