Why there needs to be a $ in calls like "runSomeMonad $ do ..."?
Asked Answered
M

1

32

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?

Metamathematics answered 20/2, 2014 at 19:12 Comment(5)
Not just do, foo if bar then quux else baz as well.Junco
It probably has something to do with the fact that you can have something like runSomeMonad (do ...) x y z ....Euchology
@DavidYoung I don't see how the proposed grammar change would prevent that kind of thing.Quartis
Just a historical accident, as far as I know.Briticism
As of GHC 8.6.1, you can enable the BlockArguments extension to allow, among other things, runSomeMonad do ....Gilly
D
26

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.

Defant answered 20/2, 2014 at 22:34 Comment(5)
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. :PDefant

© 2022 - 2024 — McMap. All rights reserved.