2012-04-16 10 views
5

Optionale Methode ist eine Methode, die angewendet werden kann, wenn Klassengenerika einen bestimmten Typ haben. Beispiele:Was ist der beste Weg, um optionale Typen von Typ Safe in Scala zu definieren?

list.unzip //works only if this is collection of pairs 
list.sum //works only if this collection of numbers 

Aktuell möchte ich Regressionsmethode implementieren, die die gleichen Einschränkungen wie unzip (dh das Einsammeln von 2d Punkte) hat, aber ich weiß nicht, wie sicher (implicit asPair: A => (A1, A2) exsist diese Methode zu machen und wo der beste Ort, um Definieren Sie solche Konvertierungen.

+4

Das könnte dir finden [generali Typ Einschränkungen] (http: // Stackoverflow com/questions/3427345/was-und-was-in-scala-2-8-und-wo-sind-sie-dokumentiert) nützlich. –

Antwort

10

Hier ist, was TraversableOnce.toMap tut, um sicherzustellen, dass es nur für eine Sammlung von Paaren aufgerufen wird.

def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] = { 
    val b = immutable.Map.newBuilder[T, U] 
    for (x <- self) 
    b += x 
    b.result 
} 

Aber wenn Sie schauen, um ein ähnliches Verfahren zu einer bestehenden Sammlung Klasse hinzuzufügen, können Sie es noch einfacher machen:

class EnhancedIterable[T,U](x: Iterable[(T,U)]) { // CanBuildFrom omitted for brevity 
    def swapAll() = x.map(_.swap) 
} 
implicit def enhanceIterable[T,U](x: Iterable[(T,U)]) = new EnhancedIterable(x) 

List((1,2), (3,4), (5,6)).swapAll // List((2,1), (4,3), (6,5)) 
List(1, 2, 3).swapAll // error: value swapAll is not a member of List[Int] 
Verwandte Themen