2017-08-08 17 views
11

„zwróci” ma zawinąć w kontekście jakiegoś Monady:Dlaczego "return nothing" nic nie zwraca?

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

Jeśli pytam GHCI co rodzaj „powrót nic” jest, jest on zgodny, że:

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

Ale jeśli ją oceniać, nie widzę zewnętrzną monady, tylko wewnętrzna Może:

*Main> return Nothing 
Nothing 
+11

GHCi domyślnie monady IO jeśli nie podasz. To jest po prostu drukowanie zawartości 'IO (może a)' – 4castle

+7

@ 4castle Aby nieco zinterpretować shachaf: 'IO (Maybe a)' zawiera 'Maybe a' w ten sam sposób, w jaki'/bin/ls' zawiera listę plików. Może to brzmieć nieco pedantycznie, ale nie jest to drukowanie zawartości 'IO (Maybe a)'. Działa 'IO (Maybe a)', a następnie drukuje wyniki tego. Rozróżnienie może być ważne. –

+1

@DavidYoung Nie osobiście uważam, że rozróżnienie jest ważne, ponieważ zadaniem monady IO jest poznanie wewnętrznej reprezentacji wartości. Dla celów rozumowania zwykle uważam wszystkie monady za pojemniki (niezależnie od tego, czy zawierają one wartość, czy nie). – 4castle

Odpowiedz

21

Kiedy GHCi idzie wydrukować wartości, próbuje dwie różne rzeczy. Najpierw próbuje zunifikować typ za pomocą IO a dla niektórych a. Jeśli może to zrobić, wykonuje operację We/Wy i próbuje wydrukować wynik. Jeśli nie może tego zrobić, próbuje wydrukować podaną wartość. W twoim przypadku Monad m => m (Maybe a) można zunifikować z IO (Maybe a).

Przeglądanie tej sesji GHCi może pomóc:

Prelude> return Nothing 
Nothing 
Prelude> return Nothing :: IO (Maybe a) 
Nothing 
Prelude> return Nothing :: Maybe (Maybe a) 
Just Nothing 
Prelude> Nothing 
Nothing 
Powiązane problemy