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?
Why there needs to be a $ in calls like "runSomeMonad $ do ..."?
Asked Answered
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.
Years ago, I built GHC from sources with the grammar modified in this sort of way, and it indeed seemed not to break anything (e.g, it could successfully rebuild itself). I especially liked the look of calls which pass arguments to the block, like
withOpenFile path \ handle -> do ...
–
Gullett @Brandon: I suppose you wouldn't have the time to push this modification as an e.g.
{-# LANGUAGE UnparenthesizedLayoutHeralds #-}
extension? –
Alb @leftaroundabout: Maybe with a slightly shorter name… –
Defant
What, shorter? Whenever I type
MultiParamTypeClasses
I'm so delighted that Emacs' auto-complete is disabled in "comments", I'd love more of that kind of fun... –
Alb @leftaroundabout: Solution: type
XMulti
, hit M-/ to dabbrev-expand
from the compiler error “perhaps you meant -XMultiParamTypeClasses
”, then delete the X
. :P –
Defant © 2022 - 2024 — McMap. All rights reserved.
foo if bar then quux else baz
as well. – JuncorunSomeMonad (do ...) x y z ...
. – EuchologyBlockArguments
extension to allow, among other things,runSomeMonad do ...
. – Gilly