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


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?


32
2018-02-20 19:12


origen


Respuestas:


Tenga en cuenta que puede observar este efecto no solo do, pero también let, if, \, case, las extensiones mdo y proc... y el terror único -. No puedo pensar en un caso en el que esto sea ambiguo excepto para unario -. Así es como se define la gramática en el Haskell 2010 Language Report, §3: Expresiones.

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 permite un sin aparente lexp (lambda, let, etc.) Consideraría esto un error en la gramática.

Reparar esto también eliminaría la necesidad de el $ escribiendo hack.


26
2018-02-20 22:34