> Is it possible and senseful for a compiler to extract common
> sub-expressions? Naively I think that for a given tree of an
> expression it is efficiently possible to find all common sub-trees.
> Referential transparency would assure that equal expressions have the
> same value, so they can be replaced by the same object. E.g. the
> example above could be automatically transformed to:
>> ms as =
> let tmp0 = zipWith (+) (zipWith (*) as tmp1) (0:tmp1)
> tmp1 = 1:tmp0
> in tmp0
It's possible and will preserve semantics, but isn't always an
optimization.
http://www.haskell.org/pipermail/haskell-cafe/2003-December/005574.html