Prior to version 1.3, Haskell went even further - IO a
didn’t exist! So the entire program was just an ordinary effect-free function:
main :: [Response] -> [Request]
with the role of runDialogue
(from the aforementioned dialogue
package) delegated to a rather-hefty subroutine in each Haskell 1.2 implementation. But this denotative style was deemed embarrassing, and prompted the switch to monadic I/O in Haskell 1.3:
But now IO a
is deemed “semantically opaque”, and apparently needs to be finely-sliced into systems of effects: 250 of them and counting (…unless the effect system doesn’t have a typed effect which matches the actual effect; then it’s back to that “lowest common denominator”, IO a
- hrm).
Be they absent from or present in Haskell, effects (side or otherwise) are frustrating for many to to deal with…