One of the things haskell can do with lazy sequences is fuse away intermediate data structures, e.g. take
map f . map g
and substitute
map (f . g)
automatically (as a compiler optimization). I don't think that's a safe transformation in general in a non-pure language; not sure about a pure strict language.