2017-07-28 2 views
1

Ich schrieb map1 Funktion ähnlich List.map wie:Was mit der Verwendung von Lambda falsch ist hier

def map1[A, B](xs: List[A], f: A => B): List[B] = { 
    xs match { 
    case List() => scala.collection.immutable.Nil 
    case head :: tail => f(head) :: map1(tail, f) 
    } 
} 

Nun, wenn ich die oben rufen:

map1(List(1, 2, 3), x => x + 1) 

Ich bekomme Fehler wie: error: missing parameter type. Aber folgende Arbeiten:

List(1, 2, 3).map(x => x + 1) 

Warum map1 nicht mit lamdas arbeiten?

+1

Es ist kein Lambda-Problem, da dies funktioniert '(x: Int) => x + 1 '. Es ist ein Problem mit der Typ-Inferenz-Engine. – jwvh

+0

Inferenz-Problem: Typ "A" kann für "f" von "xs" wie in der gleichen Parameterliste abgeleitet werden – cchantep

Antwort

4

In Scala funktioniert Argument Typ Inferenz zwischen Argumentenlisten und nicht innerhalb von ihnen. Damit der Compiler den Typ schließen, bewegen f auf seine eigene Argumentliste:

def map1[A, B](xs: List[A])(f: A => B): List[B] = { 
    xs match { 
    case Nil => scala.collection.immutable.Nil 
    case head :: tail => f(head) :: map1(tail)(f) 
    } 
} 
Verwandte Themen