加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何理解遍历,遍历和遍历

发布时间:2020-12-16 09:43:28 所属栏目:安全 来源:网络整理
导读:我对于遍历,遍历和遍历的使用情况感到困惑,我在scalaz网站上搜索了简单的代码示例: def sum(x: Int) = x + 1 List(1,2,3).traverseU(sum) 它看起来像(map和aggregate)类似: List(1,3).map(sum).reduceLeft(_ + _) 我认为这不仅仅是为了遍历,我只是想知
我对于遍历,遍历和遍历的使用情况感到困惑,我在scalaz网站上搜索了简单的代码示例:

def sum(x: Int) = x + 1

 List(1,2,3).traverseU(sum)

它看起来像(map和aggregate)类似:

List(1,3).map(sum).reduceLeft(_ + _)

我认为这不仅仅是为了遍历,我只是想知道这3种方法之间有什么区别,那么我会有一些示例代码来显示差异

提前谢谢了

解决方法

序列用于聚集应用效果。更具体地说,如果G是适用的并且F是可扩展的,则可以将“F [G [A]]转换为G [F [A]]。所以我们可以用它“拉起”一堆应用效果(注意所有Monads都是适用的):

List(Future.successful(1),Future.successful(2)).sequence : Future[List[Int]]
// = Future.successful(List(1,2))
List(4.set("abc"),5.set("def")).sequence : Writer[String,List[Int]]
// = List(4,5).set("abcdef")

遍历相当于映射然后序列,所以当您有一个返回一个应用程序的函数,并且您想要仅获取一个单独的实例,而不是列出它们时,可以使用它:

def fetchPost(postId: Int): Future[String]
//Fetch each post,but we only want an overall `Future`,not a `List[Future]`
List(1,2).traverse[Future,String](fetchPost): Future[List[String]]

traverseU是与遍历相同的操作,只是类型表达不同,以便编译器可以更容易地推断它们。

def logConversion(s: String): Writer[Vector[String],Int] =
  s.toInt.set(Vector(s"Converted $s"))
List("4","5").traverseU(logConversion): Writer[Vector[String],List[Int]]
// = List("4","5").map(logConversion).sequence
// = List(4.set("Converted 4"),5.set("Converted 5")).sequence
// = List(4,5).set(Vector("Converted 4","Converted 5"))

traverseM(f)等效于遍历(f).map(_。join),其中join是flatten的scalaz名称。它作为一种“提升flatMap”是有用的:

def multiples(i: Int): Future[List[Int]] =
  Future.successful(List(i,i * 2,i * 3))
List(1,10).map(multiples): List[Future[List[Int]]] //hard to work with
List(1,10).traverseM(multiples): Future[List[Int]]
// = List(1,10).traverse(multiples).map(_.flatten)
// = List(1,10).map(multiples).sequence.map(_.flatten)
// = List(Future.successful(List(1,3)),Future.successful(List(10,20,30)))
//     .sequence.map(_.flatten)
// = Future.successful(List(List(1,3),List(10,30))).map(_.flatten)
// = Future.successful(List(1,3,10,30))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读