Apparently the only possible interpretation of runSomeMonad do ...
is runSomeMonad (do ...)
. Why isn't the first variant allowed by the Haskell syntax? Is there some case where foo do bar
could be actually ambiguous?
Note that you can observe this effect with not just do
, but also let
, if
, \
, case
, the extensions mdo
and proc
…and the dread unary -
. I cannot think of a case in which this is ambiguous except for unary -
. Here’s how the grammar is defined in the Haskell 2010 Language Report, §3: Expressions.
exp → infixexp :: [context =>] type | infixexp infixexp → lexp qop infixexp | - infixexp | lexp lexp → \ apat1 … apatn -> exp | let decls in exp | if exp [;] then exp [;] else exp | case exp of { alts } | do { stmts } | fexp fexp → [fexp] aexp aexp → ( exp ) | …
There just happens to be no case defined in fexp
(function application) or aexp
(literal expression) that allows an unparenthesised lexp
(lambda, let
, etc.). I would consider this a bug in the grammar.
Fixing this would also remove the need for the $
typing hack.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With