显然,唯一可能的解释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 回答