2016-11-17 90 views
5

有沒有人有一個如何使用和與列表的例子?我注意到,然後定義List,但文檔沒有示例來說明如何使用它。然後列表斯卡拉

我的理解是f和then 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是不是像過濾器的方法更有效,地圖等的用途之一,我可以看到上面是有andThen,我可以創造一個新的功能,P,這是一個組合的其他功能。但是這個用法帶來了有用性,然後,而不是列表和然後

回答

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,而不是(我想不出任何關於我的頭頂) 。


在代碼中,你實際上並沒有使用上的List本身andThen。相反,您正在將它用於傳遞給map等的函數。映射List兩次的結果在fg之間的映射結果和映射一次之間的結果沒有區別。然而,當多次映射變得昂貴時,使用該組合物是優選的。在List的情況下,當列表很大時,多次遍歷可能在計算上花費很多。

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