2015-08-09 3 views
8

Ist die folgende Abstraktion mit Instanzen von Contravariant, Divisible und etc. bereits in einem Paket implementiert? Ich impliziere etwas im Geist des folgenden übersetzbar Code:Auf der Suche nach einem Dual von ReaderT, die über die Umgebung statt monadischen Ergebnis abstrahiert

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 

Antwort

7

Sie diese Art als eine Zusammensetzung von Op von contravariant und Ap von reducers aufbauen kann. Op a b ist nur b -> a, und hat eine Divisible Instanz für jede Monoid a.

das Verhalten Ihrer Instanz zu erhalten, können wir Ap m a verwenden, die jeder Applicative m und Monoid a eine Monoid mit mappend = liftA2 (<>) und mempty = pure mempty für zur Verfügung stellt.

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