2015-06-04 7 views
7

otrzymują prosty sekwencja:anonimowych parametry Robocze- ale nie wyraźne te - dla Scala reduceLeft

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

Dodajmy je!

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

Ale jak być wyraźnym z parametrami? Oto moja próba:

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

Cóż .. nie .. Mamy niedopasowanie typu:

<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 

Ale nawet kiedy dodać w rodzajach wyraźnie to nie działa:

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} 

Co tu się dzieje?

Odpowiedz

7

reduceLeft pobiera Function2 a nie jako Function1 z parametrem wejściowym krotki. W związku z tym nie trzeba używać case do dopasowania wzorca; musisz tylko nazwać swoje dwa argumenty wejściowe.

Komunikat o błędzie nie jest tutaj szczególnie pomocny, ponieważ informuje o tym, czego brakuje, ale nie w sposób, który wyraźnie informuje, dlaczego to, co robisz, jest nieprawidłowe.

Użyj a.reduceLeft((a,b) => a + b). (Szelki są w porządku).

+0

dzięki. Wkrótce nagrodzę (wygląda na zegar oznaczający 5 minut). – javadba

2

Co napisałaś tutaj:

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

jest częściowym funkcja.

Rzućmy okiem na podpis typu zmniejszyć lewej:

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

Widzimy, że trwa funkcja wyższego rzędu op że przyjmuje dwa parametry, jeden typu B, drugi typu A i zwraca wartość B.

W tym przypadku mijamy op jako anonimową funkcję tak:

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

+0

Twoje wyjaśnienie jest również pomocne: przyznano mi nagrodę RexKerr, ale wznowiłem twoje. – javadba

Powiązane problemy