【问题标题】:Is there a general way of transforming a Future[Reader[A, X]] to Reader[A, Future[X]]?是否有将 Future[Reader[A, X]] 转换为 Reader[A, Future[X]] 的通用方法?
【发布时间】:2016-12-09 13:13:35
【问题描述】:

这样的转换对于任何函子都是可能的,不仅仅是Future

implicit class RichFunctorReader[F[_]: Functor, A, B](fr: F[Reader[A, B]]) {
  def toReaderFunctor: Reader[A, F[B]] = Reader { a => fr.map(_.run(a)) }
}

我想知道它是否是 Reader monad 的特殊属性,还是有更一般的概念使这成为可能?

例如,当我们将Reader 概括为Kleisli 时,它不起作用,所以我怀疑Reader 在这里是一个“特例”。

【问题讨论】:

  • 这叫做sequence,当你交换两种类型时,F[G[A]] => G[F[A]]。关于为什么在没有Traverse 实例的情况下可以做到这一点:我不确定这是否是正确的推理,但你正在做的是 +/- point(fr.map(copoint)),所以你需要来自的 point Monad 和对应的 Comonad 中的 copoint... 虽然我不完全确定这是否是一个有效的论点,因为您只能在本地构造 copoint

标签: scala functional-programming scalaz


【解决方案1】:

Reader 的此属性称为Distributivecosequence 方法实现了您的转换。

【讨论】:

  • 谢谢,这行得通!你知道 Scalaz 中没有 Distributive Reader 的原因吗? Kleisli 有一个,但它要求嵌套类型构造函数是可分配的,这里不是这种情况。手写作品:gist.github.com/adamw/65eb05116de6628719f0c438c8fe6ee7
  • 虽然 ... 在Reader 的情况下,Kleisli 中的类型构造函数是Id,这(我认为?)显然是可分配的?但由于某种原因,添加隐式 Distributive[Id] 不会使 KleisliInstances11.kleisliDistributive “捕获”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 2013-12-20
相关资源
最近更新 更多