【问题标题】:Natural Transformations From Reader Bool To Maybe从 Reader Bool 到 Maybe 的自然转换
【发布时间】:2016-08-17 22:13:56
【问题描述】:

我正在阅读 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))

我想找到一个自然的转变

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 建造一个广场,并进行自然转换。

例如:

                          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都是这些函子之间的自然转换。

标签: haskell functor category-theory


【解决方案1】:

正如我在评论中已经说过的,您希望 n 使用环境,但是由于您只有 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 lemma 告诉我们

Nat(Hom(X,_), F) = F(X)

也就是说,从函子Hom(X,_) 到函子F 的自然变换与集合F(X) 的元素一一对应。

在我们的例子中,X = BoolF = Maybe,所以我们得到

Nat(Hom(Bool,_),Maybe) = Maybe Bool

Maybe Bool 正好包含三个元素:Just TrueJust FalseNothing,它们对应于答案开头的实现。

【讨论】:

  • 有道理!所以,只有 3 种可能的 nat。 Reader BoolMaybe 之间的转换,对吧?然后在问题 #2 中,他要求从Reader ()List 的自然转换。我想出了:n (Reader f) = [f ()] 和无限的n (Reader f) = [() ... ()]。这准确吗?
  • @Josh.F, Reader () 在道德上与Identity 同构。所以你得到一个元素,需要列出一个列表。因此,每个自然数都有一个这样的自然变换(不要忘记 0),再加上无限的变换。我想。
  • @dfeuer 没错!米田也给出了同样的结论:自然变换 Reader () -> List 对应于 List ()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
相关资源
最近更新 更多