2015-08-09 7 views
8

La seguente astrazione con istanze di Contravariant, Divisible e così via è già stata implementata in alcuni pacchetti? Voglio dire qualcosa nello spirito del seguente codice compilabile:Alla ricerca di un doppio di ReaderT, che riassume l'ambiente anziché il risultato monadico

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 

risposta

7

si può costruire questo tipo come una composizione di Op da contravariant e Ap da reducers. Op a b è solo b -> a e ha un'istanza Divisible per qualsiasi Monoid a.

per ottenere il comportamento del vostro esempio, possiamo usare Ap m a, che fornisce un Monoid con mappend = liftA2 (<>) e mempty = pure mempty per qualsiasi Applicative m e Monoid a.

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