2011-10-31 9 views
8

En ghci:ghci special case for Applicative?

λ> :t (pure 1) 
(pure 1) :: (Applicative f, Num a) => f a 
λ> show (pure 1) 

<interactive>:1:1: 
    No instance for (Show (f0 a0)) 
     arising from a use of `show' 
    Possible fix: add an instance declaration for (Show (f0 a0)) 
    In the expression: show (pure 1) 
    In an equation for `it': it = show (pure 1) 
λ> pure 1 
1 

¿Quiere decir esto que ghci ejecutar Aplicativo y muestra el resultado, al igual que IO?

Tenga en cuenta que pure() y pure (+1) no imprimen nada.

Respuesta

11

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)

+2

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

+0

Aquí hay un ejemplo más del uso de Applicative, Functor y IO: 'pure (+1) <*> fmap (leer :: String -> Int) getLine' – nponeccop