下面是我們如何定義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