寻找ReaderT的双重性,它对环境进行抽象而不是monadic结果

Nik*_*kov 8 haskell

是的情况下,下面的抽象Contravariant,Divisible等等,并且在一些软件包中已经实现的?我暗示了以下可编译代码的精神:

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
Run Code Online (Sandbox Code Playgroud)

ben*_*ofs 7

您可以将此类型构建为Opfrom contravariantApfrom 的组合reducers.Op a b只是b -> a,并且有Divisible任何实例Monoid a.

为了获得实例的行为,我们可以使用Ap m a,它提供了Monoidwith mappend = liftA2 (<>)mempty = pure memptyfor any Applicative mMonoid a.

type ReaderDual a m b = Op (Ap m a) b
Run Code Online (Sandbox Code Playgroud)