2017-11-18 1 views
0

Eine einfache Funktionsliteral alsVerständnis scala-Typen für Funktionen

geschrieben werden kann

def (x: Int) add = x + 2

Im obigen Beispiel füge ich verstehe, ist eine Funktion, die ein Int nimmt und gibt eine Int. Sein Typ ist hinzufügen: (x: Int) Int

Es ist sehr klar.

Aber das folgende Beispiel der vom Typ Option ist [Int] => Int es ist ein wenig unklar

scala> def matchFunction : Option[Int] => Int = { 
    | case Some(x) => x 
    | case None => 0 
    | } 
matchFunction: Option[Int] => Int 

Im zweiten Beispiel kann jemand erklären, warum nicht der Typ sollte es

def matchFunction (x : Option[Int]) : Int 
seine

auch bitte erklären, was der Unterschied zwischen der obigen Funktion ist und die unten die verwendet Spiel aus einer Art Perspektive

def matchFunction (x : Option[Int]) : Int = x match { 
    case Some(x) => x 
    case None => 0 
} 
+0

'add' ist eine Methode nicht funktionieren. also möchten Sie wissen https://StackOverflow.com/Questions/2529184/Difference-between-Method-and-Function-in-Scala – chengpohi

+0

@Genchpohi, warum ist eine Methode hinzufügen, aber MatchFunction eine Funktion. Beide sind def, also warum unterscheidet man sich von den anderen? – Srinivas

+0

'matchFunction' ist eine parameterlose Methode, so dass Sie sie wie eine Variable verwenden können, und sie gibt eine' function' zurück. gleich: 'def matchFunction(): ...' – chengpohi

Antwort

1

Dies ist einer der funktionalen Programmieraspekte: Funktionen höherer Ordnung - diejenigen, die andere Funktionen als Parameter annehmen oder deren Ergebnis eine Funktion ist. Option[Int] => Int ist eine anonyme Funktion, die Option[Int] als Parameter und Int zurückgibt, anonyme Funktion kann immer ausgedrückt werden def, def matchFunction(x : Option[Int]): Int = { ... } ist nur eine andere Variante zum Ausdrücken Option[Int] => Int = { ... }. Funktionen höherer Ordnung sind nützlich für die Verallgemeinerung, den Polymorphismus. So können Sie Ihre matchFunction Funktion übergeben, die Option[Int] => Int Funktion als Parameter übernimmt. List(Some(1), None, Some(2)).map(matchFunction) gibt Ihnen List(1, 0, 2).

https://www.scala-exercises.org/scala_tutorial/higher_order_functions

+0

Vielen Dank für Ihre Hilfe. Ich verstehe jetzt. – Srinivas