Cuando se escribe una expresión expr
en GHCi, sucede lo siguiente:
- La expresión es de tipo comprobado. Si hay un error, GHCi le dice el error y se da por vencido.
- De lo contrario, digamos
expr
tiene el tipo t
; GHC intenta hacer coincidir t
contra IO a
.
- Si tiene éxito, entonces se ejecuta algo así como
it <- expr
, entonces si a
es una instancia de Show
y no ()
Es decir, se ejecuta print it
.
- Si falla, y
t
en sí es una instancia de Show
, GHCi hace algo así como let it = expr
y luego print it
.
- De lo contrario, se queja.
Esencialmente, necesita una forma en el indicador GHCi para ejecutar acciones IO y obtener los valores que devuelve, y jugar con valores puros y ver lo que obtiene. Es por eso que GHCi se comporta de la manera que lo hace: si parece que estás usando una acción IO, GHCi lo hará, y luego si esa acción tiene un resultado que se puede mostrar y es interesante (es decir, no ()
), muestra el resultado para ti Si no puede mostrar el resultado para usted, entonces no es gran cosa, porque probablemente solo quiera ejecutar la acción IO de todos modos; si quisiera el resultado, lo habría nombrado con <-
. Por otro lado, si parece que su expresión es no una acción IO, GHCi lo calcula y se lo muestra, y si no se puede mostrar, entonces GHCi no puede hacer nada útil (no tiene efectos secundarios) tiempo), así que se queja.
En este caso, return "abc"
typechecks como IO String
, y String
es una instancia de Show
, por lo GHCi hace algo como
it <- return "abc"
print it
que, por las leyes de las mónadas es exactamente el mismo que acaba de hacer
print "abc"
de ahí el resultado.
IO. ¡Una sesión de ghci es como una IO Monad especial! – is7s