下面的带有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发布于 2015-08-09 16:40:45
您可以将此类型构建为来自contravariant的contravariant和来自reducers的Ap的组合。Op a b只是b -> a,并且为任何Monoid a都有一个Divisible实例。
要获取实例的行为,我们可以使用Ap m a,它为任何Applicative m和Monoid a提供带有mappend = liftA2 (<>)和mempty = pure mempty的Monoid。
type ReaderDual a m b = Op (Ap m a) bhttps://stackoverflow.com/questions/31904974
复制相似问题