【问题标题】:In Scala, how to pass function with multiple parameter lists as an argument?在 Scala 中,如何将具有多个参数列表的函数作为参数传递?
【发布时间】:2016-04-05 04:57:34
【问题描述】:
def multi_fun(i:Int, s:String)(d:Double) […]

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

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

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

【问题讨论】:

  • 函数不能有多个参数列表。 multi_fun 是一个方法,而不是一个函数。

标签: scala function parameters


【解决方案1】:
def fun_that_likes_multi_fun(mf:(Int, String)=>Double => Unit)={}

你提到的函数是一个柯里化函数。这意味着应用第一个参数列表的结果是另一个函数,该函数将第二个参数列表全部处理。 所以它是这样表示的。

【讨论】:

  • 感谢您的回答!我将如何传递带有隐式参数的函数,即 def multi_fun(i:Int, s:String)(implicit d:Double) [...] 编译器说:“找不到参数 d 的隐式值”,即它认为我喜欢应用 multi_fun 而不是将它作为参数传递。我怎样才能告诉 Scala 这样做呢? “multi_fun _”也不起作用。
  • 你会这样做。只需确保此时可以隐式使用 double 值。喜欢implicit val d:Double = 1.00
  • 它似乎不像那样工作: def multi_fun(i: Int, s: String)(implicit d: Double) {} def fun_that_likes_multi_fun(mf: (Int, String) => Double => Unit) { /*implicit*/ val d1:Double = 1.0 mf(1, "a")(d1) } /*implicit val d2:Double = 1.0*/ fun_that_likes_multi_fun(multi_fun) 即使 d2 可用,它不编译(这不是我想要的,但实际用例由 d1 显示:multi_function 通常与隐式值一起使用,但对于这种特殊情况,需要传递给高阶函数)。
【解决方案2】:

就像这样:

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

【讨论】:

  • 感谢您的回答!我将如何传递带有隐式参数的函数,即 def multi_fun(i:Int, s:String)(implicit d:Double) [...] 编译器说:“找不到参数 d 的隐式值”,即它认为我喜欢应用 multi_fun 而不是将它作为参数传递。我怎么能告诉 Scala 这样做呢? “multi_fun _”也不起作用。
  • 感谢您的回答和解决方法!这正是我正在使用的那个,我只是没有觉得它“好”。 ;-) 我认为在像 Scala 这样非常精简的语言中,在我看来应该有一种直接的方法来传递带有隐式参数的函数。
  • 如果 multiFun 和 highOrderFun 带类型参数怎么办?
  • @Aivean 非常感谢您的更新。没有明确说明我的问题是我的错。实际上,我的 highOrderFun 采用两个参数列表, (content: T)(mf: (T: String) => Unit multiFun 仍然采用隐式参数我想要实现的是调用 highOrderFun(1.0)(multiFun) 而不指定 multiFun 的类型参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 2013-11-02
  • 2016-08-05
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多