2013-11-21 15 views
5

w Scala, można użyć granice kontekstu:Kontekst ograniczającą z dwóch parametrów ogólnych

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

oznaczać to samo co:

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

Co zrobić, jeśli mam klasy z dwoma parametrami generycznych. To znaczy. Chcę być w stanie zapewnić, że mam Writer[T, String]. Czy istnieje składnia, w której można użyć ograniczeń kontekstu (T : ...) lub czy muszę mieć jawnie jawnie (fajnie było pisać).

Odpowiedz

10

Tak, jest to możliwe! Ale nie naprawdę bardzo ładna:

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 
} 

A potem:

scala> writeToString(1) 
res0: String = 1 

({ type L[x] = Writer[x, String] })#L rzeczą jest nazywany type lambda. Czasami są bardzo wygodne (jeśli buggy), ale to zdecydowanie nie jest jeden z tych czasów. Znacznie lepiej ci z wyraźnym niejawnym.

+1

Będę trzymać się wyraźnego domniemania! – schmmd

Powiązane problemy