然后在List scala中

时间:2016-11-17 15:43:38

标签: scala

有没有人有一个如何使用和使用列表的例子?我注意到,然后为List定义了但是文档没有一个示例来说明如何使用它。

我的理解是f和然后g表示执行函数f然后执行函数g。函数g的输入是函数f的输出。它是否正确?

问题1 - 我编写了以下代码,但我不明白为什么我应该使用,然后因为我可以用map获得相同的结果。

scala> val l = List(1,2,3,4,5)
l: List[Int] = List(1, 2, 3, 4, 5)

//simple function that increments value of element of list
scala> def f(l:List[Int]):List[Int] = {l.map(x=>x-1)}
f: (l: List[Int])List[Int]

//function which decrements value of elements of list
scala> def g(l:List[Int]):List[Int] = {l.map(x=>x+1)}
g: (l: List[Int])List[Int]

scala> val p = f _ andThen g _
p: List[Int] => List[Int] = <function1>

//printing original list
scala> l
res75: List[Int] = List(1, 2, 3, 4, 5)

//p works as expected.
scala> p(l)
res74: List[Int] = List(1, 2, 3, 4, 5)

//but I can achieve the same with two maps. What is the point of andThen?
scala> l.map(x=>x+1).map(x=>x-1)
res76: List[Int] = List(1, 2, 3, 4, 5)

有人可以分享一些实际的例子,其中andThen比filter,map等方法更有用。上面我可以看到的一个用途是,然后我可以创建一个新函数p,它是其他函数的组合。但是这种用法带来了andThen的有用性,而不是List和andThen

2 个答案:

答案 0 :(得分:11)

andThenPartialFunction继承了List的继承树中的几个父母。当您通过索引访问其元素时,可以使用List作为PartialFunction。也就是说,您可以将List视为从索引(从零开始)到在列表本身中占据该索引的元素的函数。

如果我们有一个清单:

val list = List(1, 2, 3, 4)

我们可以像函数一样调用list(因为它是一个):

scala> list(0)
res5: Int = 1

andThen允许我们将一个PartialFunction与另一个List组合在一起。例如,也许我想创建一个2,我可以通过索引访问其元素,然后将元素乘以val list2 = list.andThen(_ * 2) scala> list2(0) res7: Int = 2 scala> list2(1) res8: Int = 4

map

这与在列表中使用view基本相同,除了计算是懒惰的。当然,您可以使用List完成相同的操作,但可能会有一些通用情况,您希望将PartialFunction视为andThen,而不是({1}}我无法想到任何一个问题。

在您的代码中,您实际上并未在List上使用map。相反,您将其用于您传递给List等的功能。将f两次映射到g之间的结果没有区别f andThen g并在List上映射一次。然而,当多次映射变得昂贵时,优选使用该组合物。在 .ifdef, .ifndef s的情况下,当列表很大时,遍历多次可能会有点计算成本。

答案 1 :(得分:2)

使用解决方案l.map(x=>x+1).map(x=>x-1),您将遍历列表两次。 使用andThen组合子组合2个函数然后将其应用于列表时,只需遍历列表一次。

val h = ((x:Int) => x+1).andThen((x:Int) => x-1)
l.map(h) //traverses it only once