我正在阅读Haskell in depth这本书,我注意到了下面的代码示例:
withReader :: (r' -> r) -> Reader r a -> Reader r' a这看起来像contramap。Control.Monad.Reader和Data.Functor.Contravariant之间的关系是什么
发布于 2021-11-03 06:39:51
Reader的类型参数的顺序不正确,无法使其成为contramap。Contravariant函数器的最后一个类型参数始终需要是逆变量,但Reader的第一个类型参数是逆变量。但您可以这样做:
newtype FlippedReader a r = FlippedReader (Reader r a)
instance Contravariant (FlippedReader a) where
contramap f (FlippedReader x) = FlippedReader (withReader f x)Reader也几乎是一个Profunctor,带有lmap = withReader和rmap = fmap,但这并不是很有效,因为Reader r a实际上是ReaderT r Identity a的类型同义词(尽管您可以使用另一个newtype包装器来使其工作,就像我上面所做的那样)。(->)实际上是一个具有相同行为的Profunctor,它与Reader同构。
https://stackoverflow.com/questions/69817514
复制相似问题