显然,唯一可能的解释runSomeMonad do ...是runSomeMonad (do ...)。为什么 Haskell 语法不允许第一个变体?在某些情况下foo do bar实际上可能模棱两可吗?
2020 次
1 回答
26
请注意,您不仅可以使用do, let, if, \,case扩展名mdo和proc... 以及 dread unary来观察这种效果-。除了unary之外,我想不出这是模棱两可的情况-。以下是Haskell 2010 语言报告第 3 节:表达式中定义语法的方式。
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 )
| …
fexp在(function application) 或(literal expression) 中恰好没有定义aexp允许不带括号的lexp(lambda let, 等) 的 case。我认为这是语法中的错误。
于 2014-02-20T22:34:53.377 回答