我正在阅读Bartosz的精彩博客,并在追随第三个挑战问题,但有点困惑:
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
。但这感觉有点单子性,或者像嵌套在Reader Bool (Maybe Int)
中的Maybe
,所以我不确定。
我无法想象如何做到这一点。我能想到最好的方法是:
n :: Reader Bool a -> Maybe a
n (Reader f) = Just (f True)
但是这无法考虑环境,也不能返回 Nothing
。
我想建立一个可交换的结构,通过使用 fmap
和自然变换来构建一个正方形。
例如:
nat
Reader Bool Int +---------------------------> Maybe Int
+ +
| |
| |
| |
| fmap show | fmap show
| |
| |
| |
| |
v nat v
Reader Bool String +--------------------------> Maybe String
你能帮我填补空缺吗?
n
使用环境,但是由于你只有 Reader,没有环境,所以你必须自己提供它。我认为Just (f True)
、Just (f False)
和Nothing
都是这些函子之间的自然变换。 - lisyarus