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 .