6

Nel libro Functional Programming In Scala, c'è un esempio di "Sollevamento" in cui una funzione con tipo A => B viene promossa a Option[A] => Option[B].Confusione con le funzioni di sollevamento in Scala

Questo è il modo di sollevamento viene implementato:

def lift[A,B](f: A => B):Option[A] => Option[B] = _ map f 

Ho un paio di confusioni riguardo a questa:

Il primo è, che cosa è il '_' qui? E in secondo luogo, quando rimuovo il tipo restituito dal DEF, in attesa del tipo di inferenza per fare la sua magia ottengo la seguente eccezione:

scala> def lift[A,B](f: A => B) = _ map f 
<console>:7: error: missing parameter type for expanded function ((x$1) => x$1.map(f)) 
     def lift[A,B](f: A => B) = _ map f 

Qualcuno può spiegare cosa sta succedendo qui?

Grazie

risposta

10
  1. lift è una funzione che restituisce una funzione. La funzione ha restituito ascensori un valore (senza nome) applicando la funzione f a tale valore. Il valore senza nome da sollevare viene indicato come _. Si può certamente dare un nome più esplicito:

    def lift[A,B](f: A => B): Option[A] => Option[B] = { value => value map f } 
    
  2. Il tipo di ritorno di tale funzione (quello che viene restituita) deve essere sia dichiarato esplicitamente o implicitamente determinata. Come scritto, la compilazione può dedurre che quello che deve essere restituito è un (in particolare, Option[A] => Option[B] restituisce una funzione Option[A] => Option[B] (esplicitamente dichiarata), mentre quella funzione ha il tipo di ritorno Option[B] (determinato implicitamente)). Senza questo tipo di informazioni, il compilatore ha bisogno di qualche altra indicazione su quale sia il/i tipo/i di ritorno.

    In alternativa, definire lift così:

    def lift[A,B](f: A => B) = { value: Option[A] => value map f } 
    

    Qui si sta affermando in modo esplicito il tipo per value, e il compilatore può dedurre

    • il tipo di ritorno della funzione è tornato ad essere Option[B], perché f: A => B eseguirà la mappatura del tipo A a B,
    • il tipo di reso per lift per essere Option[A] => Option[B].