Obtiene el mismo comportamiento si utiliza return
en lugar de pure
. Para saber qué hacer, ghci debe elegir un tipo para la expresión dada. Las reglas de incumplimiento de ghci son tales que, a falta de otras restricciones, elige IO
para una instancia de Applicative
o Monad
. Por lo tanto, interpreta pure 1
como una expresión del tipo IO Integer
. Las expresiones de tipo IO a
ingresadas en el indicador se ejecutan y sus resultados se imprimen, si 1. a
tiene una instancia de Show
y 2. a
no es ()
. Por lo tanto entrar en pure 1
en los resultados rápidos en
v <- return (1 :: Integer)
print v
return v
siendo ejecutado (y la variable mágica it
ligado a la v
devuelto). Para pure()
, el caso especial se aplica desde ()
se considera carente de interés, por lo que sólo se ejecuta return()
y it
obligado a ()
, por pure (+1)
, se devuelve una función, no hay Show
ejemplo para las funciones de perímetro, por lo que nada se imprime. Sin embargo,
Prelude Control.Applicative> :m +Text.Show.Functions
Prelude Control.Applicative Text.Show.Functions> pure (+1)
<function>
it :: Integer -> Integer
Prelude Control.Applicative Text.Show.Functions> it 3
4
it :: Integer
con una instancia Show
para las funciones de perímetro, que se imprime (no es que sea informativo), y la función a continuación, se puede utilizar (este último es independiente de una instancia Show
estar en su alcance, por supuesto)
Acabo de darme cuenta de que 'instancia Applicative IO'. Por lo tanto, también permite 'pure 1 >> = \ it -> imprimirlo' para que funcione. Acabo de enterarme del módulo 'Text.Show.Functions'. Siempre me he preguntado por qué las funciones no se podían mostrar por defecto. – gawi
Aquí hay un ejemplo más del uso de Applicative, Functor y IO: 'pure (+1) <*> fmap (leer :: String -> Int) getLine' – nponeccop