2016-07-05 13 views
1

Ich habe versucht, mehr Scala zu lernen und lief in this interesting article diskutieren F-begrenzte Typen. Ich war besonders an der abschließenden Diskussion über die Arbeit mit Wertesammlungen mit solchen Typen interessiert.Funktion Anwendung über Sammlungen mit F-begrenzten Typen

Ein einfaches Beispiel:

abstract class AbsClass[A <: AbsClass[_]] { 
    this: A => 
    def me: A = this 
} 

def me2[A <: AbsClass[A]](a: A): A = a 

case class C1(v: Int) extends AbsClass[C1] 
case class C2(v: Int) extends AbsClass[C2] 

Wie im Blog-Beitrag gezeigt, wir Existenzquantor uns zu ermöglichen, können me2 über eine Liste von C1 anrufen und C2

scala> List[A forSome {type A <: AbsClass[A] }](C1(1), C2(2)).map(me2(_)) 
res2: List[A forSome { type A <: AbsClass[A] }] = List(C1(1), C2(2)) 

Jetzt Ich habe versucht, ein paar Variationen über den Typ für die Liste, und ich hatte gehofft, jemand mit mehr Erfahrung könnte einige der Subtilität hinweisen , dass ich Missi bin ng.

Die folgenden Werke, wie ich es

scala> val l2 = List[A forSome {type A <: AbsClass[A] }](C1(1), C2(2)) 
l2: List[A forSome { type A <: AbsClass[A] }] = List(C1(1), C2(2)) 

scala> l2.map(_.me) 
res4: List[A forSome { type A <: AbsClass[A] }] = List(C1(1), C2(2)) 

zu

erwartet kann ich auch _.me nennen und die Liste bezeichnen als Instanzen AbsClass[A] forSome {type A}, wie in

scala> val l: List[AbsClass[_]] = List(C1(1), C2(2)).map(_.me) 
l: List[AbsClass[_]] = List(C1(1), C2(2)) 

enthält, aber wenn ich versuche, die anzuwenden gleiche Karte zu l wieder, verliere ich Typinformationen und bin mit einem List[Any] stecken. Gibt es eine Möglichkeit, den Typ hier zu erhalten?

Antwort

1

Beachten Sie, dass der Unterstrich ein Typ gebunden ist.

val l: List[AbsClass[_]] = List(C1(1), C2(2)).map(_.me) 

val ll: List[AbsClass[_ >: Nothing <: Any]] = List(C1(1), C2(2)).map(_.me) 

Diese beiden Dinge sind gleich. Der Unterstrich wird entweder in die Untergrenze von Nichts oder in die Obergrenze von Irgendwelche einbrechen.

Weitere Informationen zur Funktionsweise existenzieller Typen finden Sie unter: https://youtu.be/NFnsFda82Yo