Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 926
Petr Avatar asked Feb 20 '14 19:02

Petr


1 Answers

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.

like image 104
Jon Purdy Avatar answered Oct 05 '22 15:10

Jon Purdy