In my experience, this is a huge problem with Haskell. Laziness, for all of its benefits, makes it difficult to reason correctly about performance in large code bases. I think non-strict evaluation by default probably was a mistake. Other than that, Haskell is great.