Jos*_*h.F 13 haskell functor category-theory
我正在阅读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))
Run Code Online (Sandbox Code Playgroud)
我想找到一个自然的转变
n :: Reader Bool a -> Maybe a
Run Code Online (Sandbox Code Playgroud)
我的直觉是,如果Reader环境是True,我可以拥有Just a,如果False,然后自然转型项目Nothing.但是感觉有点像monadic,或者像Maybe嵌套在里面Reader一样Reader Bool (Maybe Int),所以我不确定.
我不能断定如何做到这一点.我最好的是:
n :: Reader Bool a -> Maybe a
n (Reader f) = Just (f True)
Run Code Online (Sandbox Code Playgroud)
但这不能兼顾环境,也不能回归Nothing.
我想构建一个通勤,构建正方形fmap和自然变换的结构.
例如:
nat
Reader Bool Int +---------------------------> Maybe Int
+ +
| |
| |
| |
| fmap show | fmap show
| |
| |
| |
| |
v nat v
Reader Bool String +--------------------------> Maybe String
Run Code Online (Sandbox Code Playgroud)
你能帮我填补空白吗?
lis*_*rus 19
正如我在评论中已经说过的那样,您希望n使用环境,但是,由于您只有Reader,因此没有环境,您必须自己提供.
显然,这些实际上是三种不同的自然变换Reader Bool a -> Maybe a:
n (Reader f) = Just (f True)
n (Reader f) = Just (f False)
n (Reader f) = Nothing
Run Code Online (Sandbox Code Playgroud)
让我们证明没有更多.在类别理论术语中,算子Reader Bool a就是Hom(Bool,_).现在,Yoneda引理告诉我们
Nat(Hom(X,_), F) = F(X)
Run Code Online (Sandbox Code Playgroud)
也就是说,从仿函数Hom(X,_)到仿函数的自然变换F与集合的元素一一对应F(X).
在我们的情况下,X = Bool和F = Maybe,所以我们得到
Nat(Hom(Bool,_),Maybe) = Maybe Bool
Run Code Online (Sandbox Code Playgroud)
Maybe Bool恰好包含三个元素:Just True,Just False和Nothing,这相当于实现在答案的开始.