gpt4 book ai didi

haskell - 这个和KleisliFunctor类似的东西是什么?

转载 作者:行者123 更新时间:2023-12-02 16:49:24 27 4
gpt4 key购买 nike

我们可以这样定义 KleisliFunctor :

class (Monad m, Functor f) => KleisliFunctor m f where
kmap :: (a -> m b) -> f a -> f b
kmap f = kjoin . fmap f

kjoin :: f (m a) -> f a
kjoin = kmap id

这个类型有类

class (Functor f, Monad m) => Absorb f m where
(>>~) :: f a -> (a -> m b) -> m b
a >>~ f = ajoin $ fmap f a

ajoin :: f (m a) -> m a
ajoin a = a >>~ id

适合范畴论吗?法律是什么?他们是吗

a >>~ g . f     === fmap f a >>~ g
a >>~ (f >=> g) === a >>~ f >>= g

最佳答案

这是一个推测性的答案。谨慎行事。

我们首先考虑KleisliFunctor ,重点关注类似绑定(bind)的箭头映射:

class (Monad m, Functor f) => KleisliFunctor m f where
kmap :: (a -> m b) -> f a -> f b

这实际上是 m 的 Kleisli 类别中的仿函数。至Haskkmap必须遵循相关仿函数定律:

-- Mapping the identity gives identity (in the other category).
kmap return = id
-- Mapping a composed arrow gives a composed arrow (in the other category).
kmap (g <=< f) = kmap g . kmap f

事实上有两个 Functor涉及的事情让事情有点不寻常,但并非不合理——例如,法律确实适用于 mapMaybe ,这是第一个具体示例 KleisliFunctor帖子提到。

至于Absorb ,为了清楚起见,我将翻转类似绑定(bind)的方法:

class (Functor f, Monad m) => Absorb f m where
(~<<) :: (a -> m b) -> f a -> m b

如果我们正在寻找类似于KleisliFunctor的东西,立即出现的一个问题是哪个类别将具有 f a -> m b 类型的函数作为箭头。它当然不可能是 Hask,因为它的身份(类型 f a -> m a )不能是 id 。我们不仅要弄清楚身份,还要弄清楚组成。对于与 Monad 并不完全不同的东西...

idAbsorb :: f a -> m a
compAbsorb :: (f b -> m c) -> (f a -> m b) -> (f a -> m c)

...我现在能想到的唯一合理的事情就是单子(monad)态射为 idAbsorb并在相反方向上使用第二个单子(monad)态射(即从 mf ),以便 compAbsorb可以通过应用第一个函数,然后返回 f 来实现最后应用第二个函数。我们需要解决这个问题,看看我的假设是否合适,这种方法是否有效,以及它是否会产生对您的目的有用的东西。

关于haskell - 这个和KleisliFunctor类似的东西是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40716239/

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