scala - 为什么将偏函数应用于以 2 种不同方式定义的执行相同操作的 2 个函数会返回不同的结果?

标签 scala

我可以定义以下两个函数:

def add(a: Int, b: Int, c: Int) = a + b + c

这导致
add: (a: Int, b: Int, c: Int)Int


val add2 = (a: Int, b: Int, c: Int) => a + b + c

这导致
add2: (Int, Int, Int) => Int = <function3>

这两个都是做完全相同的事情但以不同方式定义的函数,我不明白的是,如果我继续定义一个部分应用的函数,如下所示:
def a = add _

这导致
a: (Int, Int, Int) => Int = <function3> 

正如预期的那样,一个接受 3 个参数并返回一个 Int 的函数,但如果我这样做
def a2 = add2 _

这导致
a2: () => (Int, Int, Int) => Int = <function0>

这似乎是一个不带参数的函数,并返回一个带 3 个 Int 参数并返回一个 Int 的函数。为什么会发生这种情况?有人可以解释一下发生了什么吗?

谢谢

最佳答案

这是 Scala 的一个奇怪的副作用,它实际上没有(用户可访问的)字段,而是拥有所有东西的访问器(getter)。观察:

scala> val i = 1
i: Int = 1

scala> i _
res0: () => Int = <function0>

原因是i实际上是底层(隐藏的,不可访问的)字段的访问器( def i: Int )。既然只是方法,_将其转换为函数。访问器不带任何参数,这就是为什么你有一个不带参数的函数。

关于scala - 为什么将偏函数应用于以 2 种不同方式定义的执行相同操作的 2 个函数会返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9543514/

相关文章:

scala - 如何编写一个 scala 函数来接受两种类型的参数?

scala - 作为 Spark 作业提交时 Spark RDD 映射中的 NullPointerException

scala - 模式匹配 scala 2.13.4 的奇怪行为

scala - Slick codeGenerator 未填充外键名称导致断言失败 : duplicate foreign key names detected

serialization - Marshal.load 上的 ClassNotFoundException

scala - 如何使用 Slick and Play 在测试中手动应用进化! 2.4

scala - 为什么我可以更新 scala 中扩展不可变特征的对象的状态

scala - saveAsNewAPIHadoopFile() 在用作输出格式时出错

java - Play框架-简单表达式的非法开始

Scala 等价于自定义类的 Range 方式