2012-08-04 6 views
13

puedo definir una función que acepta un Seq[Char]Scala: ¿por qué no puedo asignar una función aceptar Sec [Char] a través de una colección de cadenas

def f(s: Seq[Char]) = s 

y funciona si paso en un String:

scala> f("this") 
res8: Seq[Char] = this 

lo que significa que puedo usar en un map:

scala> List("this").map(s => f(s)) 
res9: List[Seq[Char]] = List(this) 

¿Por qué no puedo hacer esto ?:

scala> List("this").map(f) 
<console>:10: error: type mismatch; 
found : Seq[Char] => Seq[Char] 
required: java.lang.String => ? 
       List("this").map(f) 
          ^

Respuesta

11

No se puede hacer eso porque no hay promoción de una conversión implícita A => B-F[A] => F[B]. En particular, f es en realidad una instancia del tipo Seq[Char] => Seq[Char], y es necesario que la conversión implícita de String => Seq[Char] genere una función String => Seq[Char]. Scala no realiza conversiones implícitas de dos pasos como esta.

Si se escribe s => f(s), Scala es libre de jugar con los tipos de manera que se convierte en sSeq[Char] antes de ser pasado a f.

+1

Tenía la sensación de que tenía que ver con la limitación de conversión implícita en dos pasos. ¡Gracias por la explicación! – dhg

3

Tal vez la mejor manera de resolver esto es:

def f[S <% Seq[Char]](s: S): S = /* some code */ 

Entonces, map y amigos funcionará como se espera.

Cuestiones relacionadas