2017-08-08 2 views
11

« retour un » est censé envelopper un dans le cadre de certains Monad:Pourquoi "return Nothing" ne renvoie rien?

*Main> :i return 
class Applicative m => Monad (m :: * -> *) where 
    ... 
    return :: a -> m a 
    ... 
     -- Defined in ‘GHC.Base’ 

Si je demande GHCi ce que le type de « retour Rien » est, il est conforme à ce que:

*Main> :t return Nothing 
return Nothing :: Monad m => m (Maybe a) 

Mais si je l'évaluer, je ne vois pas Monad extérieur, juste peut-être intérieur:

*Main> return Nothing 
Nothing 
+11

par défaut ghci à l'IO monade si vous ne spécifiez pas. Il suffit d'imprimer le contenu d'un 'IO (Maybe a)' – 4castle

+7

@ 4castle Pour fausser légèrement le shachaf: Un 'IO (Maybe a)' contient un 'Maybe a' de la même manière que'/bin/ls' contient une liste des fichiers. Cela peut sembler un peu pédant, mais il n'imprime pas le contenu de 'IO (Maybe a)'. Il exécute un 'IO (Maybe a)' et en imprime les résultats. La distinction peut être importante. –

+1

@DavidYoung Personnellement, je ne trouve pas la distinction importante, car c'est le travail de la monade des OI de connaître la représentation interne de la valeur. À des fins de raisonnement, je pense habituellement à toutes les monades en tant que contenants (qu'elles contiennent ou non la valeur). – 4castle

Répondre

21

Lorsque GHCi va imprimer une valeur, il essaie deux choses différentes. Tout d'abord, il tente d'unifier le type avec IO a pour certains a. S'il peut le faire, il exécute l'action E/S et essaie d'imprimer le résultat. S'il ne peut pas faire cela, il essaie d'imprimer la valeur donnée. Dans votre cas, Monad m => m (Maybe a) peut être unifié avec IO (Maybe a).

L'examen de cette session GHCi pourrait aider:

Prelude> return Nothing 
Nothing 
Prelude> return Nothing :: IO (Maybe a) 
Nothing 
Prelude> return Nothing :: Maybe (Maybe a) 
Just Nothing 
Prelude> Nothing 
Nothing