2012-05-21 14 views
11

Chciałbym wdrożyć metodę, która ma arbitralny Seq[T] i zwraca Seq[T], jak również. Ale pod warunkiem, że jest dostarczony String, powinien również zwrócić String.Metoda przyjmuje Seq [T], aby zwrócić ciąg zamiast Seq [Char]

Przechodząc String prace z powodu jakiegoś niejawna konwersja z String do WrappedString extends IndexedSeq[Char], ale pojawia Seq[Char] w zamian. Czy można odzyskać String?

val sx: Seq[Int] = firstAndLast(List(1, 2, 3, 4)) 
val s1: Seq[Char] = firstAndLast("Foo Bar") 
val s2: String = firstAndLast("Foo Bar") //incompatible types error 

def firstAndLast[T](seq: Seq[T]) = Seq(seq.head, seq.last) 

firstAndLast() realizacja ma znaczenia, to tylko przykład.

Odpowiedz

15

Tak, jest to możliwe. Trzeba będzie wymagać jeden z tych fantazyjnych CanBuildFrom s:

import scala.collection.generic.CanBuildFrom 

def firstAndLast[CC, A, That](seq: CC)(implicit asSeq: CC => Seq[A], cbf: CanBuildFrom[CC, A, That]): That = { 
    val b = cbf(seq) 
    b.sizeHint(2) 
    b += seq.head 
    b += seq.last 
    b.result 
} 

ta będzie również działać z tablicami. Bonus: wszystkie linie w twoim przykładzie będą kompilować i działać zgodnie z oczekiwaniami.

+0

Jestem prawie pewien, że nie będzie działać z tablicami; nie masz zdefiniowanego manifestu –

+2

To działa, ponieważ wymagany "ClassManifest" jest dostarczany pośrednio do metody dostarczającej odpowiedni 'CanBuildFrom',' scala.Array.canBuildFrom'. –

+2

To powinno być łatwiejsze z "OdRepr" Milesa, jak sądzę. –

Powiązane problemy