
At Thu, 5 Feb 2009 11:06:22 -0600, Gregg Reynolds wrote:
Are you saying that using equations to add a level of indirection prevents optimization? I still don't see it - discarding x doesn't change the semantics, so a good compiler /should/ do this. How is this different from optimizing out application of a constant function?
Let rewrite this: 'getChar >>= \x -> getChar' in a slightly different looking form, where bind = (>>=) so that we have: bind getChar (\x -> getChar) If I understand your argument, you think that the compiler should be able to look at that expression, and instead of calling 'bind' with the two arguments 'getChar' and '(\x -> getChar)' it should just optimize it to 'getChar'? By comparision, consider this function: op :: Maybe a -> (a -> Maybe b) -> Maybe b op x f = Nothing I believe that by your argument we should be able to rewrite this: (Just "foo") `op` \x -> (Just "bar") as: (Just "bar") because the 'x' is ignored? But, 'op' *always* returns Nothing, and clearly Nothing /= (Just "bar")? Maybe I misunderstanding what you mean when you say that 'discarding x does not change the semantics'. Thanks! - jeremy