首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Seq[Reader[E,A]]转换为Reader[E,Seq[A]]

如何将Seq[Reader[E,A]]转换为Reader[E,Seq[A]]
EN

Stack Overflow用户
提问于 2015-11-30 20:44:32
回答 1查看 146关注 0票数 3

这是我的实际解决方案

代码语言:javascript
复制
  private def transpose[E, A](readers : Seq[Reader[E, A]]) : Reader[E, Seq[A]] =
    Reader { e: E => readers.map { r => r(e) } }

是否有更简单的解决方案(可能与现有的组合器)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-30 21:35:25

这个操作本质上是sequence

代码语言:javascript
复制
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实例(尽管它适用于ListVector等)。你可以自己写,但我建议你写不这么做

(作为一个脚注,这里的U末尾的sequenceU只是帮助解决Scala类型推断的一部分--请参阅我的博客这里以获得一些背景信息。)

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

https://stackoverflow.com/questions/34007660

复制
相关文章

相似问题

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