在Scala中,如何将带有多个参数列表的函数作为参数传递?

时间:2016-04-05 04:57:35

标签: scala function parameters

def multi_fun(i:Int, s:String)(d:Double) […]

如何将此函数现在作为参数传递给另一个函数,即需要指示哪个参数类型?

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

这不起作用,甚至无法解析。

2 个答案:

答案 0 :(得分:8)

就像这样:

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

答案 1 :(得分:6)

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

你提到的功能是一个curried功能。这意味着应用第一个参数列表的结果是另一个使第二个参数列表完整处理的函数。 所以它就是这样表达的。