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
Funktionen können nicht mehrere Parameterlisten haben. 'multi_fun' ist eine Methode, keine Funktion. –