Vamos a declarar una definición y una función equivalente como val:Métodos y contra la función implícitos en Scala
scala> def optional(x:Int):Option[String] = None
optional: (x: Int)Option[String]
scala> val optional2:(Int)=>Option[String] = (i:Int) => None
optional2: Int => Option[String] = <function1>
Ahora por qué no funciona?
scala> List(1).flatMap(optional2)
<console>:9: error: type mismatch;
found : Int => Option[String]
required: Int => scala.collection.GenTraversableOnce[?]
List(1).flatMap(optional2)
^
Mientras que ambos hacen?
scala> List(1).flatMap(optional)
res4: List[String] = List()
scala> List(1).flatMap(optional2(_))
res5: List[String] = List()
Dado que la opción no es un subtipo de GenTraversableOnce, creo que esto debe tener algo que ver con la implícitos, pero no puedo averiguar qué es exactamente lo que es. Estoy usando Scala 2.9.1.
sí, pero ¿por qué no se puede aplicar en el primer caso? –
@KimStebel, no hay conversión implícita para 'optional2'. En el segundo caso 'optional2 (_)', el compilador crea una función para usted e intenta hacer coincidir el tipo de devolución y es cuando elige 'option2Iterable'. – huynhjl
En otras palabras, no hay conversión implícita de 'Función [T, R1] => Función [T, R2]' donde existe un 'R1 => R2' implícito. Necesita construir un nuevo objeto de función con 'optional2 (_)' para que pueda ocurrir la conversión implícita, en este caso 'i => optional2 (i: Iterable [String])'. 'optional2' es un objeto,' optional2 (_) 'es uno nuevo. –