Если у меня есть две монады m
и n
, а n
- проходящая, обязательно ли у меня есть композитная m
-over- n
монада?
Более формально, вот что я имею в виду:
import Control.Monad
import Data.Functor.Compose
prebind :: (Monad m, Monad n) =>
m (n a) -> (a -> m (n b)) -> m (n (m (n b)))
mnx `prebind` f = do nx <- mnx
return $ do x <- nx
return $ f x
instance (Monad m, Monad n, Traversable n) => Monad (Compose m n) where
return = Compose . return . return
Compose mnmnx >>= f = Compose $ do nmnx <- mnmnx `prebind` (getCompose . f)
nnx <- sequence nmnx
return $ join nnx
Естественно, этот тип проверяет, и я считаю, что это работает для нескольких случаев, которые я проверил (Reader Over List, State over List) - как и в, составленная "монада" удовлетворяет законам монады, но я unsure, если это общий рецепт для разбиения любой монады на проходящую через нее.