두 개의 모나드가있는 경우 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
,이 유형 검사, 그리고 내가 확인 몇 가지 경우에 대한 작품을 믿는다 (목록을 통해 독자를, 국가 목록 이상) - :
더 공식적으로, 여기에 내가 생각하고있는거야 에서와 같이 구성된 '모나드'는 모나드 법칙을 충족시킵니다. 그러나이 모 바브가 통과 할 수있는 모나드를 겹겹이 만드는 방법은 일반 인 경우 확실하지 않습니다.
[여기] (http://www.math.mcgill.ca/barr/papers/ttt.pdf)는 범주 이론의 관점에서이 주제를 다루는 훌륭한 책입니다 (특히, p257 "Distributive 법칙 "이라고 부르며, 범주 이론을 이미 알고있는 누군가의 관점에서) 상대적으로 *를 제공한다. 'M'과 'N'이 모나드이면 모나드가됩니다. [Here] (http://stackoverflow.com/questions/29453915/composing-monads-v-applicative-functors)는 주어진 코드에 약간의 변형을 나타내는 또 다른 질문입니다. 아마도 더 유용한 출발점이 될 것입니다 . – user2407038
겁탈 자 : 그렇습니다. – user2407038
롤, 고마워요! 나는 그 스레드를 오래 전에 읽지 못했지만, 긍정적 인 대답을 담고있는 [이 주석] (http://stackoverflow.com/questions/29453915/composing-monads-v-applicative-functors#comment47075703_29454112)을 놓쳤습니다. –