Facciamo dichiarare una definizione e una funzione equivalente come val:Metodi rispetto delle funzioni e impliciti in 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>
Ora, perché non funziona?
scala> List(1).flatMap(optional2)
<console>:9: error: type mismatch;
found : Int => Option[String]
required: Int => scala.collection.GenTraversableOnce[?]
List(1).flatMap(optional2)
^
Mentre entrambi fanno?
scala> List(1).flatMap(optional)
res4: List[String] = List()
scala> List(1).flatMap(optional2(_))
res5: List[String] = List()
Dal momento che l'opzione non è un sottotipo di GenTraversableOnce, penso che questo deve avere qualcosa a che fare con impliciti, ma non riesco a capire che cosa si tratta esattamente. Sto usando Scala 2.9.1.
sì, ma perché non può essere applicato nel primo caso? –
@KimStebel, non c'è conversione implicita per 'optional2'. Nel secondo caso, 'opzionale2 (_)', il compilatore crea una funzione per te e cerca di far corrispondere il tipo restituito ed è quando sceglie 'option2Iterable'. – huynhjl
In altre parole, non esiste alcuna conversione implicita da 'Funzione [T, R1] => Funzione [T, R2]' in cui esiste un implicito 'R1 => R2'. È necessario creare un nuovo oggetto funzione con 'optional2 (_)' in modo che possa avvenire la conversione implicita, in questo caso 'i => optional2 (i: Iterable [String])'. 'optional2' è un oggetto,' optional2 (_) 'è uno nuovo. –