[Haskell-cafe] Re: Why is $ right associative insteadofleftassociative?

Brian Hulley brianh at metamilk.com
Sun Feb 5 16:40:16 EST 2006


Chris Kuklewicz wrote:
> Brian Hulley wrote:
>> Ben Rudiak-Gould wrote:
>>> Paul Hudak wrote:
>>>> Minor point, perhaps, but I should mention that : is not special
>>>> syntax -- it is a perfectly valid infix constructor.
>>>
>>>> <snip>
>>> ... but no more confusing than the fact that [f x | x <- xs] is
>>> not the same as (map f xs).
>>
>> Can you explain why? On page 258 of Paul Hudak's book "The Haskell
>> School of Expression" he states that do x<- xs; return (f x) is
>> equivalent to [f x | x <- xs] "which is clearly just map f xs"
>>
>> I can't find anything wrong with the example in the book but perhaps
>> I've missed something?
>
> He may mean that if you *redefine* the operator Prelude.((:)) then the
> desugaring and other steps may end up binding the old or the new (:)
> and no longer be identical.  This is touched on in
>
> http://www.haskell.org/ghc/docs/6.4.1/html/users_guide/syntax-extns.html#rebindable-syntax
>
> In particular, if you redefine Monad, then [ f x | x<-xs ] and do
> {x<-xs; return x} may no longer mean the same thing.

Thanks. I didn't realise that list comprehension syntax was not just a sugar 
for the equivalent do expression but I see now that it is indeed translated 
differently, bypassing monads altogether, which of course is confusing but 
understandable if monads were only thought up after list comprehensions were 
already in the language.

Regards, Brian. 



More information about the Haskell-Cafe mailing list