_参数在这种情况下表示什么?

时间:2014-05-25 19:34:09

标签: scala

参数是什么" _"在下面的方法调用中表示?

这是一个接受任何类型参数的通配符吗?

val integerSorter = msort[Int]((a, b) => a < b) _

方法msort签名:

  def msort[T](less: (T, T) => Boolean)(xs: List[T]): List[T] = {

2 个答案:

答案 0 :(得分:10)

最简单的解释方法可能是让编译器完成大部分解释 - 只需尝试没有下划线的第一行:

scala> val integerSorter = msort[Int]((a, b) => a < b)
<console>:11: error: missing arguments for method msort;
follow this method with `_' if you want to treat it as a partially applied function
       val integerSorter = msort[Int]((a, b) => a < b)
                                     ^

所以你有它 - msort方法有两个参数列表,但你只传递了第一个的参数,而尾随下划线是Scala提供的语法,告诉编译器你想要部分适用于那种情况。

(如果您在REPL 中使用下划线尝试该行,您会看到integerSorter的推断类型为List[Int] => List[Int],以便回答您的​​第二个问题,不,下划线不允许您提供任何类型的参数。)

有关详细信息,请参阅the language specification的第6.7节:

  

如果e _属于方法类型或e是一个e,则表达式e格式正确   按名称调用参数。如果e _是带参数的方法,e   表示通过eta扩展将{{1}}转换为函数类型   (§6.26.5)。

阅读有关eta扩展的部分也可能有所帮助。

答案 1 :(得分:2)

msort接受两个参数,一个返回布尔值的函数,以及一个要排序的项列表。函数integerSorter提供第一个参数,下划线表示仍需要指定的列表。查看currying(http://www.scala-lang.org/old/node/135.html)以获得更详细的解释。