【发布时间】:2017-04-04 14:47:07
【问题描述】:
这是我们如何定义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
?
【问题讨论】:
-
您是否有一些特定的示例类型允许
Absorb实例,但没有足够强大的标准实例来实现(>>~)和ajoin? -
@leftaroundabout,我需要
Absorb来实现广义的单子折叠,允许在f函子中保留一个累加器,但在m单子中返回结果。参见例如this.
标签: haskell monads typeclass category-theory