Ich möchte implizit Funktionen von A => B
zu List[A] => List[B]
konvertieren.Implizite Aufhebung in scala
Ich schrieb die folgende implizite Definition:
implicit def lift[A, B](f: A => B): List[A] => List[B] = ...
Leider, wenn ich den folgenden Code schreiben, implizite nicht angewandt werden:
val plusOne: (List[Int]) => List[Int] = (x: Int) => (x + 1)
Wenn ich die Funktion mit expliziter Zeit, es mit Anmerkungen versehen funktioniert gut.
Warum? Wie kann ich es reparieren?
UPDATE. Es scheint, dass das Problem für anonyme Funktionen spezifisch ist. Vergleich:
@Test
def localLiftingGenerics {
implicit def anyPairToList[X, Y](x: (X, Y)): List[X] => List[Y] = throw new UnsupportedOperationException
val v: List[String] => List[Int] = ("abc", 239)
}
@Test
def localLiftingFuns {
implicit def fun2ListFun[X, Y](f: X => Y): List[X] => List[Y] = throw new UnsupportedOperationException
val v: List[String] => List[Int] = ((x: String) => x.length)
}
Der erste ist gut kompiliert. Der zweite wird als Fehler markiert
Können Sie den Code angeben, den Sie verwenden, um das implizite Def zu implementieren? –
@ChrisJamesC Aktualisiert mit einem Testfall –
Sind Sie sicher, dass Sie dies tun müssen/wollen? "Karte" kauft viel Klarheit für ein paar Zeichen, und z.B. 'val plusOne: (Liste [Int]) => Liste [Int] = _ map (_ + 1)' ist tatsächlich kürzer als deine Version. –