2017-08-08 4 views
11

"return a" soll ein wickeln im Rahmen einiger Monad:Warum gibt "Return Nothing" nichts zurück?

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

Wenn ich frage GHCI, was die Art der "Rückkehr Nothing" ist, ist es dem entspricht:

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

Aber wenn ich es beurteilen, sehe ich keinen äußeren Monade, sondern nur die innere Vielleicht:

*Main> return Nothing 
Nothing 
+11

GHCi standardmäßig auf die Monade IO, wenn Sie keinen festlegen. Es druckt nur den Inhalt eines 'IO (Vielleicht ein)' – 4castle

+7

@ 4castle Um shachaf etwas falsch zu maskieren: Ein 'IO (Vielleicht a)' enthält ein 'Maybe a' auf die gleiche Weise, dass'/bin/ls' eine Liste enthält von Dateien. Das mag etwas pedantisch klingen, aber es druckt nicht den Inhalt von IO (Maybe a). Es läuft ein 'IO (Maybe a)' und druckt dann die Ergebnisse davon. Die Unterscheidung kann wichtig sein. –

+1

@DavidYoung Ich persönlich finde die Unterscheidung nicht wichtig, weil es die Aufgabe der IO-Monade ist, die interne Repräsentation des Wertes zu kennen. Für Denkzwecke denke ich normalerweise an alle Monaden als Container (ob sie tatsächlich den Wert enthalten oder nicht). – 4castle

Antwort

21

wenn GHCi geht um einen Wert zu drucken, es versucht, zwei verschiedene Dinge. Zuerst versucht es den Typ mit IO a für einige a zu vereinheitlichen. Wenn es das kann, führt es die IO-Aktion aus und versucht, das Ergebnis zu drucken. Wenn dies nicht möglich ist, wird versucht, den angegebenen Wert zu drucken. In Ihrem Fall kann Monad m => m (Maybe a) mit IO (Maybe a) vereinheitlicht werden.

Überprüfung dieser GHCi Sitzung helfen könnten:

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