Alternatively, we could use an implementation that has no (heap) space to leak e.g. figure 9 on page 24 of On Inter-deriving Small-step and Big-step Semantics: A Case Study for Storeless Call-by-need Evaluation (2011). Now if that could be implemented in GHC (or some other Haskell implementation), I believe it would greatly reduce the need for strictness annotations…and the need for “semi-duplicate” types with varying levels of strictness.
That we have “semi-duplicate” definitions for varying levels of imperativity (e.g. map
and mapM
) already provides more than enough annoyance!
Erratum: I got the year wrong. 2011 was when the preprint was submitted - the paper was actually published in 2012 >_<