32

显然,唯一可能的解释runSomeMonad do ...runSomeMonad (do ...)。为什么 Haskell 语法不允许第一个变体?在某些情况下foo do bar实际上可能模棱两可吗?

4

1 回答 1

26

请注意,您不仅可以使用do, let, if, \,case扩展名mdoproc... 以及 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 回答