2015-06-04 4 views
7

Bei einer einfachen Sequenz:Anonymous Parameter erwerbsfähigen, aber nicht explizit diejenigen - für scala reduceLeft

scala> val a = Seq(1.0,2.0,3.0) 
res8: Seq[Double] = List(1.0, 2.0, 3.0) 

uns Lassen Sie sie addieren sich!

scala> a.reduceLeft{_ + _} 
res6: Double = 6.0 

Aber wie mit den Parametern explizit sein? Hier ist mein Versuch:

scala> a.reduceLeft{case(b,c) => b+c} 

Naja .. keine .. Wir haben eine Typenkonflikt:

<console>:9: error: missing parameter type for expanded function 

The argument types of an anonymous function must be fully known. (SLS 8.5) 
Expected type was: (?, Double) => ? 
       a.reduceLeft{case(b,c) => b+c} 
         ^
<console>:9: error: type mismatch; 
found : Any 
required: String 
       a.reduceLeft{case(b,c) => b+c 

Aber selbst wenn ich in den Typen hinzufügen explizit funktioniert es nicht:

scala> a.reduceLeft{case(b:Double,c:Double) => b+c} 

<console>:9: error: missing parameter type for expanded function 
The argument types of an anonymous function must be fully known. (SLS 8.5) 
Expected type was: (?, Double) => ? 
       a.reduceLeft{case(b:Double,c:Double) => b+c} 

Also, was ist hier los?

Antwort

7

reduceLeft dauert ein Function2 kein Function1 mit einem Tupel-Eingangsparameter. Daher müssen Sie case nicht verwenden, um eine Übereinstimmung zu erzielen. Sie müssen nur Ihre zwei Eingabeargumente benennen.

Die Fehlermeldung ist hier leider nicht besonders hilfreich, da sie sagt, was es fehlt, aber nicht in einer Weise, die Ihnen wirklich klar macht, warum das, was Sie tun, nicht richtig ist.

Verwenden Sie a.reduceLeft((a,b) => a + b). (Zahnspangen sind auch in Ordnung.)

+0

Dank. Ich werde bald genug vergeben (sieht aus wie die Uhr sagt 5 Minuten) – javadba

2

Was Sie hier schrieb:

a.reduceLeft{case(b,c) => b+c}

ist eine Teilfunktion.

Lassen Sie uns einen Blick auf die Art Signatur von links reduzieren:

def reduceLeft[B >: A](op: (B, A) => B): B

Wir sehen es sich um eine Funktion höherer Ordnung op nimmt die zwei Parameter nimmt, eine vom Typ B, die andere vom Typ A und gibt eine B zurück.

In diesem Fall gehen wir op als eine anonyme Funktion wie so:

a.reduceLeft((a, b) => a + b)

+0

Ihre Erklärung ist auch hilfreich: Ich habe RexKerr zugesprochen, aber habe Ihre geupdated. – javadba

Verwandte Themen