相关疑难解决方法(0)

在Scala中使用zipWith(映射多个Seq)

假设我有

val foo : Seq[Double] = ...
val bar : Seq[Double] = ...
Run Code Online (Sandbox Code Playgroud)

我希望产生一个seq,其中baz(i)= foo(i)+ bar(i).我能想到的一种方法是

val baz : Seq[Double] = (foo.toList zip bar.toList) map ((f: Double, b : Double) => f+b)
Run Code Online (Sandbox Code Playgroud)

然而,这感觉既丑陋又低效 - 我必须将seqs转换为列表(使用惰性列表进行爆炸),创建此临时元组列表,仅映射它并让它进行GCed.也许溪流解决了懒惰的问题,但无论如何,这感觉就像不必要的丑陋.在lisp中,map函数将映射多个序列.我会写的

(mapcar (lambda (f b) (+ f b)) foo bar)
Run Code Online (Sandbox Code Playgroud)

并且不会在任何地方创建临时列表.在Scala中是否存在map-over-multiple-lists函数,或者zip是否与解构相结合实际上是"正确"的方法?

functional-programming scala higher-order-functions

34
推荐指数
3
解决办法
2万
查看次数

最简洁的方法来组合序列元素

假设我们有两个序列,我们想要使用某种方法将它们组合起来

val a = Vector(1,2,3)
val b = Vector(4,5,6)
Run Code Online (Sandbox Code Playgroud)

例如,添加可能是

val c = a zip b map { i => i._1 + i._2 }
Run Code Online (Sandbox Code Playgroud)

要么

val c = a zip b map { case (i, j) => i + j }
Run Code Online (Sandbox Code Playgroud)

第二部分的重复让我觉得这应该可以在一次操作中完成.我看不到任何内置的方法.我想我真正想要的是一种zip方法,它可以跳过元组的创建和提取.

在Scala中是否有更漂亮/更简洁的方式,或者Scalaz?如果没有,你会如何编写这样的方法并将其pimp到序列上,这样我就可以编写类似的东西

val c = a zipmap b (_+_)
Run Code Online (Sandbox Code Playgroud)

functional-programming scala

7
推荐指数
1
解决办法
1442
查看次数