2016-04-28 21 views
2

我想確保能否通過使用reduceLeft而不是foldLeft來實現此目的。我在列表使用reduceLeft代替scala中的foldLeft

val included = List(46, 19, 92).foldLeft(false) { (a, i) => 
| if (a) a else (i == 19) 
| } 
included: Boolean = true 

但是我想用reduceLeft來完成相同的搜索一個給定的數字,這可能嗎?

回答

4

不是直接。類型往往是這樣的答案。

reduceLeft有型有點像:

List[A] => ((A,A) => A) => A 

給出的列表,並且可以結合2的A值到1值的函數,你會得到一個單一的值回。

你可以做的會是這樣的:

val a = List(46, 19, 92).reduceLeft { (a, b) => 
if(b == 19) b else a 
} 

val included = a == 19 

當然,你會得到更好的服務使用「包含」這比任何的這些選項。

+1

'contains',not'exists','list contains 19' vs'list exists(_ == 19)' –

+0

正確,並且是固定的,這就是當我在手機上時寫回答的原因:)。 –

5

正確的方法做,這是

val included = List(46, 19, 92).contains(19) 

但是如果你會堅持使用reduceLeft,那麼你可以這樣寫:

val included = List(46, 19, 92).reduceLeft { (a, b) => 
    if (b == 19) b else a 
} == 19 
0

你不能做一個簡單的方法。用foldLeft你可以定義結果類型:它是你的累加器的類型,所以我是你給第一個參數的零元素的類型。
ReduceLeft使用集合的第一個元素作爲累加器的零元素。因此,結果類型將與列表中的元素相同,在您的情況下爲Int。