Подтвердить что ты не робот

Естественные трансформации от читателя Bool To Maybe

Я читаю замечательный блог Bartosz и следую за вопросом 3-го вопроса, я немного озадачен:

https://bartoszmilewski.com/2015/04/07/natural-transformations/

Q3: определим некоторые естественные преобразования от Reader Bool до Maybe

Я определил функтор Reader как:

newtype Reader e a = Reader (e->a)

runReader :: Reader e a -> e -> a
runReader (Reader f) env = f env

instance Functor (Reader e) where
    fmap f (Reader g) = Reader (\x -> f (g x))

и я хочу найти естественное преобразование

n :: Reader Bool a -> Maybe a

Моя интуиция заключается в том, что если Reader окружение True, я могу иметь Just a, а если False, то естественное преобразование переходит к Nothing. Но это немного монадично, или как Maybe, вложенное внутри Reader, например Reader Bool (Maybe Int), поэтому я не уверен.

Я не могу понять, как это сделать. Самое лучшее, что у меня есть:

n :: Reader Bool a -> Maybe a
n (Reader f) = Just (f True)

Но это не может учитывать окружающую среду и не возвращать Nothing.

Я хочу построить структуру, которая коммутирует, строит квадрат из fmap и естественных преобразований.

Для ex:

                          nat
Reader Bool Int +---------------------------> Maybe Int
     +                                            +
     |                                            |
     |                                            |
     |                                            |
     |    fmap show                               |  fmap show
     |                                            |
     |                                            |
     |                                            |
     |                                            |
     v                  nat                       v
Reader Bool String  +--------------------------> Maybe String                         

Вы можете помочь мне заполнить пробелы?

4b9b3361

Ответ 1

Как я уже сказал в комментарии, вы хотите, чтобы я использовал среду, но поскольку у вас есть только Reader, нет среды, и вы должны ее предоставить самостоятельно.

Очевидно, на самом деле это три различных естественных преобразования Reader Bool a -> Maybe a:

n (Reader f) = Just (f True)

n (Reader f) = Just (f False)

n (Reader f) = Nothing

Докажите, что их больше нет. В категориальных терминах функтор Reader Bool a является просто Hom(Bool,_). Теперь лемма Yoneda сообщает нам, что

Nat(Hom(X,_), F) = F(X)

То есть естественные преобразования от функтора Hom(X,_) к функтору F находятся во взаимно однозначном соответствии с элементами множества F(X).

В нашем случае X = Bool и F = Maybe, поэтому получаем

Nat(Hom(Bool,_),Maybe) = Maybe Bool

Maybe Bool содержит ровно три элемента: Just True, Just False и Nothing, которые соответствуют реализациям в начале ответа.