【问题标题】:Is Control.Monad.Reader.withReader actually Data.Functor.Contravariant.contramap?Control.Monad.Reader.withReader 实际上是 Data.Functor.Contravariant.contramap 吗?
【发布时间】:2021-12-17 09:35:29
【问题描述】:

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

withReader :: (r' -> r) -> Reader r a -> Reader r' a

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

【问题讨论】:

  • Contravariant 捕获 Hask 类别的逆变函子。 ReaderT 是从 Hask 到比 Hask 稍微复杂的类别的逆变函子。
  • 我去了兔子洞。谢谢:)

标签: haskell functional-programming


【解决方案1】:

Reader 的类型参数的顺序不正确,无法使其成为contramapContravariant 函子始终需要在其最后一个类型参数中是逆变的,但 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 = withReaderrmap = fmap,但这并不完全有效,因为Reader r a 实际上是ReaderT r Identity a 的类型同义词(尽管你可以使用另一个@ 987654333@ wrapper 让它像我上面做的那样工作)。而(->) 实际上是具有等效行为的Profunctor,并且与Reader 同构。

【讨论】:

  • newtype FRT m e a = FRT (ReaderT e m a)。当mFunctor 时,这就是Profunctor,我相信只要mMonad,我就相信Arrow
  • @dfeuer 是的——newtype FRT m e a = FRT (ReaderT e m a) deriving (Category, Arrow) via Kleisli m
  • @duplode,是的,我知道这是Category,但我不太确定Arrow。我想我从来没有意识到ReaderTKleisli 的翻版,虽然很明显。
  • @dfeuer 确实;如果我不久前偶然发现了this (Scala!) question,我想我也不会意识到这一点。
猜你喜欢
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多