2015-08-09 10 views
8

Czy następująca abstrakcja dotyczy wystąpień Contravariant, Divisible itd. Już zaimplementowanych w niektórych pakietach? I oznaczać coś w duchu poniższego kodu compilable:Szukasz podwójnego czytnika ReaderT, który streszcza środowisko zamiast monadycznego wyniku.

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 

Odpowiedz

7

można zbudować tego rodzaju jak składzie Op z contravariant i Ap z reducers. Op a b to tylko b -> a i ma instancję Divisible dla każdego Monoid a.

Aby uzyskać zachowanie instancji, możemy użyć Ap m a, który zapewnia Monoid z mappend = liftA2 (<>) i mempty = pure mempty dla każdego Applicative m i Monoid a.

type ReaderDual a m b = Op (Ap m a) b 
Powiązane problemy