首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Control.Monad.Reader.withReader实际上是Data.Functor.Contravariant.contramap吗?

Control.Monad.Reader.withReader实际上是Data.Functor.Contravariant.contramap吗?
EN

Stack Overflow用户
提问于 2021-11-02 22:14:30
回答 1查看 111关注 0票数 6

我正在阅读Haskell in depth这本书,我注意到了下面的代码示例:

代码语言:javascript
复制
withReader :: (r' -> r) -> Reader r a -> Reader r' a

这看起来像contramapControl.Monad.ReaderData.Functor.Contravariant之间的关系是什么

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-03 06:39:51

Reader的类型参数的顺序不正确,无法使其成为contramapContravariant函数器的最后一个类型参数始终需要是逆变量,但Reader的第一个类型参数是逆变量。但您可以这样做:

代码语言:javascript
复制
newtype FlippedReader a r = FlippedReader (Reader r a)

instance Contravariant (FlippedReader a) where
    contramap f (FlippedReader x) = FlippedReader (withReader f x)

Reader也几乎是一个Profunctor,带有lmap = withReaderrmap = fmap,但这并不是很有效,因为Reader r a实际上是ReaderT r Identity a的类型同义词(尽管您可以使用另一个newtype包装器来使其工作,就像我上面所做的那样)。(->)实际上是一个具有相同行为的Profunctor,它与Reader同构。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69817514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档