2016-04-28 10 views
2

Ich wollte sicherstellen, wenn ich dies unter Verwendung reduceLeft statt foldLeft erreichen konnte. Ich suche eine bestimmte Anzahl in der ListeVerwendung reduceLeft anstelle von foldLeft in scala

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

Jedoch habe ich das gleiche mit reduceLeft, erreichen wollen ist es möglich?

Antwort

4

Nicht direkt. Die Typen, wie es oft der Fall ist, sind die Antwort.

reduceLeft hat eine Art Art wie:

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

eine Liste von A gegeben, und eine Funktion, die einen Wert 2 A-Wert in 1 kombinieren, erhalten Sie einen einzigen A-Wert zurück.

, was man tun könnte, so etwas wie sein würde:

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

val included = a == 19 

Natürlich sollten Sie besser gedient mit „enthält“ für diese als eine der beiden Optionen.

+1

'contains', nicht' exists', 'list enthält 19' vs' list exists (_ == 19) ' –

+0

Korrekt, und behoben, das ist, was ich bekomme, um Antworten zu schreiben, wenn ich mobil bin :). –

5

Der richtige Weg, dies zu tun ist

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

Aber wenn Sie reduceLeft auf verwenden, dann können Sie schreiben, bestehen würde:

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

Sie können es nicht tun. Mit foldLeft können Sie den Ergebnistyp definieren: Es ist der Typ Ihres Akkumulators, also bin ich der Typ des Nullelements, das Sie als ersten Parameter angeben.
ReduceLeft verwendet das erste Element Ihrer Sammlung als Nullelement Ihres Akkumulators. Der Ergebnistyp entspricht also den Elementen der Liste, Int in Ihrem Fall.

Verwandte Themen