了解部分使用的函数对函数文字的签名

时间:2019-06-11 03:56:02

标签: scala

我无法理解部分为函数常量应用的函数的签名。例如,请考虑以下以相同方式工作的函数和方法定义:

2>&1

现在从上面的每个方法/函数中创建部​​分应用的函数。注意结果函数的签名:

def meth(x: Int): Unit = ()
val func = (x: Int) => ()

我不明白为什么val f = meth _ // Int => Unit val g = func _ // () => Int => Unit 的签名包含func _部分,这使得() =>必须像g而不是g()(1)那样被调用。

1 个答案:

答案 0 :(得分:2)

  

例如,考虑以下以相同方式工作的函数和方法定义:

Scala中的方法和功能不相同。他们实际上是非常不同的。方法不是一流的对象,而函数则是。也就是说,您永远不会拥有类型为方法类型的变量。

因此,让我们看一下没有下划线的类型。

val f = meth
val g = func

由于meth是一种方法,因此将被称为 。因此,第一行将尝试在不带参数的情况下调用meth(),这是一个错误。 func是一个普通值,因此没有麻烦。我们将为func命名为g

val f = meth _
val g = func _

为了允许我们将方法视为对象,Scala引入了_语法。与方法一起使用时,它将方法转换为函数对象。因此meth _是一种特殊的方法语法,它将其转换为函数。另一方面,func _正在获取一个(记住,函数是对象,就像字符串或其他任何东西一样)并将其提升为函数对象。做到这一点的“最简单”方法是添加一个空的参数列表,这正是Scala要做的。

tl; dr在名称后加上_会将事物变成函数对象。如果事物是​​一种方法,则它不会应用。如果事物是​​一个值(包括但不限于一个函数),它将产生一个新的函数对象。