2015-08-09 10 views
8

Aşağıdaki paket, Contravariant, Divisible ve benzeri bir pakette zaten uygulanmış mı?Monadik sonuç yerine ortam üzerinden özetleyen bir ReaderT çiftini arıyor

newtype ReaderDual a m b = 
    ReaderDual (b -> m a) 

instance Contravariant (ReaderDual a m) where 
    contramap ba (ReaderDual a') = 
    ReaderDual $ a' . ba 

instance (Applicative m, Monoid a) => Divisible (ReaderDual a m) where 
    divide aToBC (ReaderDual b') (ReaderDual c') = 
    ReaderDual $ \a -> aToBC a & \(b, c) -> (<>) <$> b' b <*> c' c 
    conquer = 
    ReaderDual $ \_ -> pure mempty 

run :: ReaderDual a m b -> b -> m a 
run (ReaderDual a') b = 
    a' b 

cevap

7

Sen reducers den contravariant ve Ap den Op bir kompozisyon olarak bu tür inşa edebilirsiniz: Aşağıdaki Derlenebilir kod ruhu içinde birşeyler ima. Op a b sadece b -> a ve Monoid a için Divisible örneğine sahiptir.

senin Örneğin davranışı, biz Applicative m ve Monoid a herhangi mappend = liftA2 (<>) ve mempty = pure mempty ile Monoid sağlar Ap m a kullanabilirsiniz almak için.

type ReaderDual a m b = Op (Ap m a) b