为什么需要像“runSomeMonad $ do ...”这样的调用?

时间:2014-02-20 19:12:41

标签: haskell syntax monads do-notation

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

1 个答案:

答案 0 :(得分:26)

请注意,您不仅可以do,还可以letif\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