就像这样:
def multiFun(i:Int, s:String)(d:Double):Unit = ???
def highOrderFun(mF:(Int, String) => Double => Unit) = ???
highOrderFun(multiFun)
将multiFun 视为接受(Int, String) 并返回类型为Double => Unit 的函数的函数。
更新:关于隐式参数。似乎不可能按原样传递带有隐式参数的方法。 See some details here。尽管我可以为您的情况看到很好的解决方法:
def multiFun(i:Int, s:String)(implicit d:Double):Unit = ???
def highOrderFun(mF:(Int, String, Double) => Unit) = ???
highOrderFun(multiFun(_, _)(_))
这个语法multiFun(_, _)(_) 只是在multiFun 周围创建了一个包装函数,它接受三个参数,这些参数的类型是从multiFun 的参数中推断出来的。
UPD:回复@ackratos:
似乎有is no way to make lambda function type generic。主要是因为lambda函数和方法之间有一个fundamental difference。
但是由于上面的函数被定义为方法,没有什么能阻止我们将它们变成通用的:
def multiFun[T](i:T, s:String):Unit = ???
def highOrderFun[T](mF:(T, String) => Unit) = ???
highOrderFun(multiFun[Int])
可以将具有隐式参数列表的函数引用为没有参数列表的函数。在这种情况下,缺少的隐式参数将被解析值替换:
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