下面是我们如何定义KleisliFunctor
:与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
@leftaroundabout,我需要'Absorb'来实现一般化的monadic折叠,它允许在'f'函数中保留一个累加器,但将结果返回到'm'单子。见例如[本](https://github.com/effectfully/prefolds/blob/374257b12f9a2af752862addafe456cded9c0efb/test/Main.hs#L297)。 – user3237465