2016-04-05 1 views
6
def multi_fun(i:Int, s:String)(d:Double) […] 

Wie übergeben Sie diese Funktion jetzt an eine andere Funktion als Argument, d. H. Welcher Parametertyp muss angegeben werden?In Scala, wie Funktion mit mehreren Parameterlisten als Argument übergeben?

def fun_that_likes_multi_fun(mf:(Int, String)(Double) ⇒ Unit) […] 

Dies würde nicht funktionieren, fehlschlägt sogar zu analysieren.

+0

Funktionen können nicht mehrere Parameterlisten haben. 'multi_fun' ist eine Methode, keine Funktion. –

Antwort

6
def fun_that_likes_multi_fun(mf:(Int, String)=>Double => Unit)={} 

Die Funktion, die Sie erwähnt haben, ist eine curried Funktion. Das bedeutet, dass das Ergebnis der Anwendung der ersten Argumentliste eine andere Funktion ist, die die zweite Argumentliste zur vollständigen Verarbeitung übernimmt. So ist es so dargestellt.

+0

Vielen Dank für Ihre Antwort Wie würde ich eine Funktion mit impliziten Parametern übergeben, dh def multi_fun (i: Int, s: String) (implizit d: Double) [...] Der Compiler sagt: "konnte keinen impliziten Wert für Parameter d finden", dh er denkt, dass ich die multi_fun anwenden möchte anstatt sie als Argument zu übergeben. Wie kann ich Scala das sagen? "Multi_fun _ "funktioniert auch nicht. – Majakovskij

+0

Sie würden es auf die gleiche Weise tun. Stellen Sie einfach sicher, dass ein doppelter Wert verfügbar ist Implizit zu diesem Zeitpunkt. Wie 'implizit val d: Double = 1.00' –

+0

Es scheint nicht so zu funktionieren: def multi_fun (i: Int, s: String) (implizit d: Double) {} def fun_that_likes_multi_fun (mf: (Int, String) => Doppel => Unit) { /* implizite */val d1: Double = 1,0 mf (1, "a") (d1) } /* implizite val d2: Double = 1,0 */ fun_that_likes_multi_fun (multi_fun) Selbst wenn d2 verfügbar war, kompiliert es nicht (was ich sowieso nicht will, aber der tatsächliche Anwendungsfall wird durch d1 angezeigt: Die multi_function wird normalerweise mit einem impliziten Wert verwendet, aber für diesen speziellen Fall muss übergeben werden) eine Funktion höherer Ordnung). – Majakovskij

8

Genau wie folgt aus:

def multiFun(i:Int, s:String)(d:Double):Unit = ??? 

def highOrderFun(mF:(Int, String) => Double => Unit) = ??? 

highOrderFun(multiFun) 

Denken Sie an multiFun als der Funktion, die Double => Unit(Int, String) und gibt Funktion mit Typ nimmt.

Upd: In Bezug auf implizite Parameter. Es scheint, dass es nicht möglich ist, eine Methode mit impliziten Parametern zu übergeben. See some details here. Obwohl ich schön Abhilfe für Ihren Fall sehen:

def multiFun(i:Int, s:String)(implicit d:Double):Unit = ??? 

def highOrderFun(mF:(Int, String, Double) => Unit) = ??? 

highOrderFun(multiFun(_, _)(_)) 

Diese Syntax multiFun(_, _)(_) schafft nur Wrapper-Funktion um multiFun, die drei Parameter, deren Typen abgeleitet von params von multiFun nimmt.


UPD: Als Antwort auf @ackratos:

Es scheint, dass es is no way to make lambda function type generic. Vor allem, weil es eine fundamental difference zwischen Lambda-Funktionen und Methoden gibt.

Aber wie oben Funktionen als Methoden definiert sind, nichts hindert uns daran, was sie generic:

def multiFun[T](i:T, s:String):Unit = ??? 

def highOrderFun[T](mF:(T, String) => Unit) = ??? 

highOrderFun(multiFun[Int]) 

 

Es ist möglich, Funktion zu verweisen, die ohne eine implizite param Liste als Funktion hat. In diesem Fall fehlt implizites params wird aufgelöst Werte ersetzt werden:

def multiFun(s:String)(implicit i:Int):Unit = ??? 

def highOrderFun(context:Any)(mF:String => Unit)(implicit i:Int) = ??? 

implicit val param = 2 
highOrderFun(1.0)(multiFun) // param i:Int is resolved here 
+0

Vielen Dank für Ihre Antwort! Wie würde ich jedoch eine Funktion mit impliziten Parametern übergeben, zB def multi_fun (i: Int, s: String) (implizit d: Double) [...] Der Compiler sagt: "konnte keinen impliziten Wert für Parameter d finden", dh es denkt, dass ich die multi_fun gerne anwende anstatt sie als Argument zu übergeben. Wie kann ich Scala das sagen? "Multi_fun _" funktioniert auch nicht. – Majakovskij

+0

@Majakovskij siehe das Update. – Aivean

+0

Vielen Dank für Ihre Antwort und die Abhilfe! Dies ist genau die, die ich auch verwendet habe, ich fand es einfach nicht "nett".; -) Ich denke, in einer sehr stromlinienförmigen Sprache wie Scala scheint mir, es sollte eine unmittelbare Möglichkeit sein, Funktionen mit impliziten Parametern zu übergeben. – Majakovskij