2013-11-21 11 views
5

a Scala, posso utilizzare limiti di contesto:contesto delimita con due parametri generici

def sort[T : Ordered](t: Seq[T]) 

per indicare la stessa cosa:

def sort[T](t: Seq[T])(implicit def Ordered[T]) 

Che cosa succede se ho una classe con due parametri generici. Cioè Voglio essere in grado di assicurarmi di avere un Writer[T, String]. Esiste una sintassi in cui è possibile utilizzare i limiti di contesto (T : ...) o è necessario avere implicitamente l'implicito (è stato divertente scrivere).

risposta

10

Sì, è possibile! Ma in realtà non molto carina:

trait Writer[T, O] { 
    def write(t: T): O 
} 

def writeToString[T: ({ type L[x] = Writer[x, String] })#L](t: T) = 
    implicitly[Writer[T, String]].write(t) 

implicit object intToStringWriter extends Writer[Int, String] { 
    def write(t: Int) = t.toString 
} 

E poi:

scala> writeToString(1) 
res0: String = 1 

La cosa ({ type L[x] = Writer[x, String] })#L si chiama type lambda. A volte sono molto convenienti (se buggy), ma sicuramente non è una di quelle volte. Stai molto meglio con l'implicito esplicito.

+1

Continuerò con l'implicito esplicito! – schmmd

Problemi correlati