Quais regras existem sobre uma função a -> () sendo avaliada em Haskell?

Assim como o título diz: que garantias existem para que uma unidade de retorno da função Haskell seja avaliada? Alguém poderia pensar que não há necessidade de executar qualquer tipo de avaliação nesse caso; o compilador poderia substituir todas essas chamadas por um ()valor imediato, a menos que...