Естественные трансформации от читателя 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
Вы можете помочь мне заполнить пробелы?
Ответы
Ответ 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
, которые соответствуют реализациям в начале ответа.