2010-10-07 4 views
11

In Kapitel 9 der Programmierung in Scala, gibt es ein Beispiel Verfahren wie folgt aus:Pfeil nach rechts Bedeutungen in Scala

def twice(op: Double => Double, x: Double) = op(op(x)) 

Der Autor im Buch sagte:

Die Art der op in diesem Beispiel ist Double => Double, was bedeutet, dass es eine Funktion ist, die ein Double als Argument nimmt und ein weiteres Double zurückgibt.

Ich verstehe nicht, was ist „Double => Doulbe“ hier in den vorangegangenen Kapiteln, wobei „=>“ bedeutet, erscheint nur Funktionsliteral und schrieb nie wie dieser „Type => Typ“, weil nach zu scala function literal syntax defination, der rechte Teil des Funktionsliterals ist der Funktionskörper, wie kann ein Funktionskörper "Double" sein?

Antwort

38

Weil es zwei Verwendungen hat.

Zuerst könnten Sie => verwenden, um Funktionsliteral zu definieren.

scala> val fun = (x: Double) => x * 2 
fun: (Double) => Double = <function1> 

scala> fun (2.5) 
res0: Double = 5.0 

Es ist ziemlich einfach. Aber die Frage ist, welcher Typ fun ist? Es ist eine "Funktion, die ein Double als Argument nimmt und ein Double zurückgibt", richtig?

Also wie könnte ich Spaß mit seinem Typ annotieren? Das ist (Double) => (Double). Nun, das vorherige Beispiel könnte umgeschrieben werden:

OK, was macht der folgende Code?

def twice(op: Double => Double, x: Double) = op(op(x)) 

Nun, es sagt Ihnen, dass op ein (Double => Double) ist, was bedeutet es eine Funktion benötigt, die eine Doppel nimmt und eine Doppel zurück.

So könnten Sie die vorherige fun Funktion zu seinem ersten Argument übergeben.

scala> def twice(op: Double => Double, x: Double) = op(op(x))  
twice: (op: (Double) => Double,x: Double)Double 

scala> twice (fun, 10) 
res2: Double = 40.0 

Und es wird zu ersetzen op mit fun gleichwertig sein und ersetzen x mit 10, dass fun(fun(10)) ist und das Ergebnis wird 40.

11

Neben die Parameterliste aus dem Funktionskörper in einer Funktionsliteral, der Doppelpfeil als syntaktischer Zucker Trenn verwendet für einen Funktionenn Typen sein kann:

T => R bedeutet Function1[T, R]

(T1, T2) => R bedeutet Function2[T1, T2, R]

...

In Ihrem Beispiel bedeutet dies, dass op eine Funktion ist, die ein Doub nimmt le und gibt ein Double zurück (wie der Autor erklärt).

Als weiteres Beispiel ist es möglich,

// declare len as a function that takes a String and returns an Int, 
// and define it as returning the length of its argument 
val len: String => Int = { _.length } 

// or, a more verbose version that uses '=>' in both ways 
val len: String => Int = { (s: String) => s.length } 

len("apple") // returns 5 
+0

sein Warum sind Sie Aufzählen 'Function'? (wie in 'FunctionN',' Function1', etc) – corazza

+0

@jcora - FunctionN ist ein Merkmal in Scala, Function1 ist ein Typ dieses Merkmals, das eine Funktion mit 1 Argument darstellt - siehe https://gleichmann.wordpress.com/2010/11/08/funktional-scala-funktionen-wie-objekte-wie-funktionen/und http://mikefroh.blogspot.co.uk/2011/12/intro-to-funktionale-programmierung-mit.html –

2

zu schreiben, die eine Funktion ist, die eine doppelte und gibt eine Doppel nimmt.

scala> def d2d = (d:Double) => d 
d2d: (Double) => Double 

Es ist Typ ist Function1[Double,Double]

Verwandte Themen