显然runSomeMonad do ...
唯一可能的解释是runSomeMonad (do ...)
。为什么不是Haskell语法允许的第一个变体?是否存在foo do bar
实际上不明确的情况?
答案 0 :(得分:26)
请注意,您不仅可以do
,还可以let
,if
,\
,case
,扩展{{1}来观察此效果}和mdo
...以及恐惧一元proc
。对于一元-
,我无法想到除之外的模糊不清的情况。以下是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 )
| …
(函数应用程序)或fexp
(文字表达式)中没有定义允许无括号aexp
(lambda,lexp
等的大小写。 )。我认为这是语法中的一个错误。
修复此问题也不需要the $
typing hack。