从读者Bool到可能的自然转换

Jos*_*h.F 13 haskell functor category-theory

我正在阅读Bartosz的精彩博客,并继续挑战问题3,我有点难过:

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

Q3:从定义一些自然变换Reader BoolMaybe

我已将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 = BoolF = Maybe,所以我们得到

Nat(Hom(Bool,_),Maybe) = Maybe Bool
Run Code Online (Sandbox Code Playgroud)

Maybe Bool恰好包含三个元素:Just True,Just FalseNothing,这相当于实现在答案的开始.

  • @dfeuer完全正确!而Yoneda给出了相同的:自然变换`Reader() - > List`对应于`List()`. (2认同)