显然,runSomeMonad do ...
的唯一可能解释是 runSomeMonad (do ...)
。为什么 Haskell 语法不允许第一个变体?是否存在 foo do bar
实际上可能不明确的情况?
最佳答案
请注意,您不仅可以使用 do
观察此效果,还可以使用 let
、if
、\
、case
、扩展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
(文字表达式)中恰好没有定义允许不带括号的lexp
( lambda、let
等)。我认为这是语法中的错误。
修复此问题也将消除对 the $
typing hack 的需要.
关于haskell - 为什么像 "runSomeMonad $ do ..."这样的调用中需要有 $ ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21917308/