Нет, оно будет оцениваться только один раз. В вызове по имени он будет оценен четыре раза, но все реализации Haskell вызывают по необходимости (хотя стандарт не требует этого), что означает, что каждое выражение будет оцениваться максимум один раз.
Это применимо только тогда, когда выражение полностью конкретное. Например. нет гарантии, что в:
foo x = x + (1+2)
bar = foo 3 + foo 4
То, что при вычислении bar
, (1+2)
будет оцениваться только один раз. Фактически, он, вероятно, будет оценен дважды (если скомпилирован без оптимизации).