Я читаю замечательный блог 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
Вы можете помочь мне заполнить пробелы?