[Haskell-cafe] Precedence (Part 2)
Gregory Collins
greg at maptuit.com
Thu Apr 3 13:49:34 EDT 2008
PR Stanley <prstanley at ntlworld.com> writes:
> Hi folks
>
>> let f = sum.map (^2).filter even
>> f [1..4]
> 20
>
> So far so good!
>
>> sum.map (^2).filter even [1..4]
> returns an error.
>
> How is it that the composition above as part of a function equation
> doesn't return any errors while on its own it requires parentheses? I
> can understand the need for the parentheses - the composition operator
> takes two arguments/operand,s each of which is a mapping which must
> correspond to specific domain and range requirements i.e. (b->c ->
> (a->b) -> (a->c)
> Why aren't the parentheses required in the function definition?
The answer is precedence. The (.) operator is right-associative and has
lower precedence than function application, meaning that:
a . b . c . d . e == a . (b . (c . (d . e)))
so the second form is equivalent to:
sum . ((map (^2)) . (filter even [1..4]))
Typing
:t (filter even [1..4])
should give you your explanation.
If you want to avoid parentheses, you can write that expression as:
sum . map (^2) . filter even $ [1..4]
which really means
(sum . map (^2) . filter even) [1..4]
which is the same as "f [1..4]" above.
Hope that helps,
G
More information about the Haskell-Cafe
mailing list