I'm trying to wrap my head around the function application operator ($) in Haskell.
I'm working through the examples in Learn You a Haskell, and I thought I understood the following example:
Prelude> map ($ 3) [(+4), (*10), (^2), sqrt]
[7.0,30.0,9.0,1.7320508075688772]
I then tried the following variant, which also worked fine:
Prelude> map ($ 3) [(+4), (*10), (\x -> x^2), sqrt]
[7.0,30.0,9.0,1.7320508075688772]
Finally, I tried modifying the third function in the list as follows, which generates an error:
Prelude> map ($ 3) [(+4), (*10), (\x -> 2^x), sqrt]
<interactive>:53:38:
Ambiguous type variable `b0' in the constraints:
(Floating b0)
arising from a use of `sqrt' at <interactive>:53:38-41
(Integral b0) arising from a use of `^' at <interactive>:53:33
(Num b0) arising from the literal `3' at <interactive>:53:8
Probable fix: add a type signature that fixes these type variable(s)
In the expression: sqrt
In the second argument of `map', namely
`[(+ 4), (* 10), (\ x -> 2 ^ x), sqrt]'
In the expression: map ($ 3) [(+ 4), (* 10), (\ x -> 2 ^ x), sqrt]
Prelude>
It seems if the final sqrt function is somehow begin associated with the previous list element, as the following variant works ok:
Prelude> map ($ 3) [(+4), (*10), (\x -> 2^x)]
[7,30,8]
Can someone enlighten me as to what's going on here?
Prelude> :t it. "It" is a special word, referring to the previous result, and:tasks to see a type. You could see that there are no decimal points in the numbers in your last example. Also, after entering:s +tat the prompt, the GHCi will report the type for every result it produces.