gpt4 book ai didi

haskell - 从 Reader Bool 到 Maybe 的自然转换

转载 作者:行者123 更新时间:2023-12-03 15:26:53 25 4
gpt4 key购买 nike

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

我想 build 一个通勤的结构,在 fmap 中 build 一个广场和自然变换。

例如:
                          nat
Reader Bool Int +---------------------------> Maybe Int
+ +
| |
| |
| |
| fmap show | fmap show
| |
| |
| |
| |
v nat v
Reader Bool String +--------------------------> Maybe String

你能帮我填补空白吗?

最佳答案

正如我在评论中已经说过的,您希望 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 True , Just FalseNothing ,这对应于答案开头的实现。

关于haskell - 从 Reader Bool 到 Maybe 的自然转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39007078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com