От wiki.haskell.org:
Во-первых, исключение общего подвыражения (CSE) означает, что если выражение появляется в нескольких местах, код перестраивается, так что значение этого выражения вычисляется только один раз. Например:
foo x = (bar x) * (bar x)
может быть преобразовано в
foo x = let x' = bar x in x' * x'
таким образом, функция бара вызывается только один раз. (И если бар является особенно дорогостоящей функцией, это может сэкономить немало работы.) GHC фактически не выполняет CSE так часто, как вы могли ожидать. Проблема в том, что выполнение CSE может повлиять на строгость/лень программы. Таким образом, GHC выполняет CSE, но только в определенных обстоятельствах - см. Руководство GHC. (Раздел??)
Короче говоря: "Если вы заботитесь о CSE, сделайте это вручную".
Мне интересно, при каких обстоятельствах CSE "влияет" на строгость/лень программы и какой эффект может быть.