Why there needs to be a $ in calls like “runSomeMonad $ do …”?

房东的猫 提交于 2019-11-30 14:29:35

问题


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?


回答1:


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.



来源:https://stackoverflow.com/questions/21917308/why-there-needs-to-be-a-in-calls-like-runsomemonad-do

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!