haskell - 为什么像 "runSomeMonad $ do ..."这样的调用中需要有 $ ?

标签 haskell syntax monads do-notation

显然,runSomeMonad do ... 的唯一可能解释是 runSomeMonad (do ...)。为什么 Haskell 语法不允许第一个变体?是否存在 foo do bar 实际上可能不明确的情况?

最佳答案

请注意,您不仅可以使用 do 观察此效果,还可以使用 letif\case、扩展mdoproc…以及可怕的一元-。我想不出除了一元 - 之外,这是不明确的情况。以下是 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/

相关文章:

haskell - 如何在 Haskell 中定义恒定的异构流?

haskell - 寻找 `if p x then x else empty` 构造的概括

haskell - Haskell 的标准队列包?

android - 重命名列名时 SQLITE 语法错误代码 1

monads - Monad 变压器 – 显式提升

haskell - 我可以将模式传递给函数吗?

python - 在 Python 中计算阶乘

PHP - 如何正确使用带变量的大括号?

haskell - 函数式编程: Where does the side effect actually happen?