haskell syntax monads do-notation

haskell - ¿Por qué tiene que haber un $ en llamadas como "runSomeMonad $ do..."?



syntax monads (1)

Al parecer, la única interpretación posible de runSomeMonad do ... es runSomeMonad (do ...) . ¿Por qué no es la primera variante permitida por la sintaxis de Haskell? ¿Hay algún caso donde foo do bar podría ser realmente ambiguo?


Tenga en cuenta que puede observar este efecto no solo con do , sino también con let , if , / , case , las extensiones mdo y proc ... y el dread unary - . No puedo pensar en un caso en el que esto sea ambiguo excepto para unario - . Así es como se define la gramática en 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 ) | …

Simplemente no hay ningún caso definido en fexp (aplicación de función) o aexp (expresión literal) que permita un lexp sin lexp (lambda, let , etc.). Consideraría esto un error en la gramática.

Reparar esto también eliminaría la necesidad del hack de $ typing .