这是我的实际解决方案
private def transpose[E, A](readers : Seq[Reader[E, A]]) : Reader[E, Seq[A]] =
Reader { e: E => readers.map { r => r(e) } }是否有更简单的解决方案(可能与现有的组合器)?
发布于 2015-11-30 21:35:25
这个操作本质上是sequence
import scalaz.Reader, scalaz.std.list._, scalaz.syntax.traverse._
def transpose[E, A](readers: List[Reader[E, A]]): Reader[E, List[A]] =
readers.sequenceU通常,如果M有一个Traverse实例,而N是一个monad,则可以以这种方式将M[N[A]]转换为N[M[A]] (有关其他细节,请参阅我的答案这里 )。
请注意,sequence不会使用Seq,因为Scalaz没有为Seq提供Traverse实例(尽管它适用于List、Vector等)。你可以自己写,但我建议你写不这么做。
(作为一个脚注,这里的U末尾的sequenceU只是帮助解决Scala类型推断的一部分--请参阅我的博客这里以获得一些背景信息。)
https://stackoverflow.com/questions/34007660
复制相似问题