这件事与KleisliFunctor类似?

时间:2016-11-21 09:02:47

标签: haskell monads typeclass category-theory

以下是我们如何定义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

1 个答案:

答案 0 :(得分:4)

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

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

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

为了实现这个从m Hask 的Kleisli类别的仿函数,kmap必须遵循相关的仿函数法则:

-- 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的第一个具体例子1}}帖子暗示。

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

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态射(即从m到{{ 1}})这样f可以通过应用第一个函数来实现,然后返回compAbsorb并最终应用第二个函数。我们需要解决这个问题,看看我的假设是否合适,如果这种方法有效,以及它是否会为您的目的带来有用的东西。