有没有人有一个如何使用和使用列表的例子?我注意到,然后为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
答案 0 :(得分:11)
andThen
从PartialFunction
继承了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