Maj*_*kij 7 parameters scala function
def multi_fun(i:Int, s:String)(d:Double) […]
Run Code Online (Sandbox Code Playgroud)
如何将此函数现在作为参数传递给另一个函数,即需要指示哪个参数类型?
def fun_that_likes_multi_fun(mf:(Int, String)(Double) ? Unit) […]
Run Code Online (Sandbox Code Playgroud)
这不起作用,甚至无法解析.
像这样:
def multiFun(i:Int, s:String)(d:Double):Unit = ???
def highOrderFun(mF:(Int, String) => Double => Unit) = ???
highOrderFun(multiFun)
Run Code Online (Sandbox Code Playgroud)
考虑到带有类型multiFun的函数(Int, String)和返回函数Double => Unit.
Upd:关于隐式参数.似乎不可能按原样传递带隐式参数的方法.在这里查看一些细节.虽然我可以为您的案例看到很好的解决方法:
def multiFun(i:Int, s:String)(implicit d:Double):Unit = ???
def highOrderFun(mF:(Int, String, Double) => Unit) = ???
highOrderFun(multiFun(_, _)(_))
Run Code Online (Sandbox Code Playgroud)
这个语法multiFun(_, _)(_)只是创建包装函数,multiFun它接受三个参数,其类型是从params of推断出来的multiFun.
UPD:回应@ackratos:
似乎没有办法使lambda函数类型通用.主要是因为lambda函数和方法之间存在根本区别.
但是由于上面的函数被定义为方法,没有什么能阻止我们将它们变成通用的:
def multiFun[T](i:T, s:String):Unit = ???
def highOrderFun[T](mF:(T, String) => Unit) = ???
highOrderFun(multiFun[Int])
Run Code Online (Sandbox Code Playgroud)
可以将具有隐式参数列表的函数作为函数引用而不使用.在这种情况下,缺少的隐式参数将被解析的值替换:
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
Run Code Online (Sandbox Code Playgroud)
def fun_that_likes_multi_fun(mf:(Int, String)=>Double => Unit)={}
Run Code Online (Sandbox Code Playgroud)
你提到的功能是一个curried功能.这意味着应用第一个参数列表的结果是另一个使第二个参数列表完整处理的函数.所以它就是这样表达的.