Yes, GHC does some CSE stuff, but not very much. I don't think it has a large
performance impact, but (as luck would have it) but I plan to work on it a bit
in the newt few months.
My advice would be: write clear code, and let the compiler do the
CSE. If it doesn't, complain to the compiler writers. You have
good reason to believe that it should.
The exception is the case you've been discussing. The type of Right
is not
Right :: b -> Either _ b
(I don't know what "_" is) but rather
Right :: forall a,b. b -> Either a b
Since GHC keeps the types right through the compiler, it
really can't do CSE on two terms of type
Either Int Int
Either Bool Int
even if they are both applications of Right.
Actually, GHC does finally discard type information right at the
end, so we could do an extra bit of CSE there, but frankly I doubt
it would buy very much. But I'm willing to stand corrected.
Incidentally, I don't think it would be sensible to change
the type system to allow the
demo1 :: (a -> b) -> Either a c -> Either b c
demo1 f (Left a) = Left (f a)
demo1 _ r@(Right c) = r
What type does r have? Either a c.
What type does the result of the fn have? Either b c.
Different types. It would be hard (I believe) to specify crisply
when it was legitimate for two terms with different types to
be as'd together.
Simon