6

Im Buch Functional Programming In Scala gibt es ein Beispiel für' Heben ', bei dem eine Funktion mit dem Typ A => B zu Option[A] => Option[B] befördert wird.Verwechslung mit 'Heben'-Funktionen in Scala

Dies ist, wie Lift implementiert:

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

Ich habe ein paar Verwirrungen bezüglich dieser:

Die erste ist, was die ‚_‘ hier ist? Und zweitens, wenn ich die Rückkehr Typ aus der def entfernen, den Typ-Inferenz erwartet seine Magie, die ich die folgende Ausnahme erhalten zu tun:

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 

Kann jemand erklären, was hier vor sich geht?

Dank

Antwort

10
  1. lift ist eine Funktion, die eine Funktion zurückgibt. Die zurückgegebene Funktion hebt einen Wert (unbenannt) durch Anwenden der Funktion f auf diesen Wert. Der unbenannte Wert, der aufgehoben werden soll, wird _ genannt. Sie können es auf jeden Fall einen eindeutigen Namen geben:

    def lift[A,B](f: A => B): Option[A] => Option[B] = { value => value map f } 
    
  2. Der Rückgabetyp dieser Funktion (die zurückgeschickt werden) muss entweder explizit oder implizit bestimmt angegeben werden. Wie geschrieben, kann die Kompilierung folgern, dass das, was zurückgegeben werden soll, ein Option[B] ist (genauer gesagt, lift gibt eine Funktion Option[A] => Option[B] (explizit angegeben) zurück, während diese Funktion den Rückgabetyp Option[B] (implizit bestimmt) hat). Ohne diese Art von Information benötigt der Compiler andere Angaben darüber, was die Rückgabetypen sind.

    Alternativ definieren lift also:

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

    Hier sind Sie ausdrücklich auf die Art für value Angabe, und der Compiler

    • der Rückgabetyp der Funktion sein Option[B] zurück entnehmen kann, weil f: A => B den Typ A zu B,
    • den Rückgabetyp fürzuordnenzu Option[A] => Option[B] sein.