
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#reb...
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.