这会产生一个匿名函数,正如您所期望的(f 是一个具有三个参数的函数):
f(_, _, _)
我不明白为什么这不能编译,而是给出“缺少参数类型”错误:
f(_, _, 27)
相反,我需要明确指定下划线的类型。考虑到函数 f 的参数类型是什么,Scala 不应该能够推断它们吗?
最佳答案
以下引用文献是 Scala Language Specification
考虑以下方法:
def foo(a: Int, b: Int) = 0
Eta 扩展可以将其转换为
(Int, Int) => Int
类型的值.在以下情况下调用此扩展:一)
_
用于代替参数列表(方法值(第 6.7 节))val f = foo _
b) 参数列表被省略,表达式的预期类型是函数类型(第 6.25.2 节):
val f: (Int, Int) => Int = foo
c) 每个参数都是
_
(“匿名函数的占位符语法”(第 6.23 节)的 special case)val f = foo(_, _)
表达式,
foo(_, 1)
不符合 Eta 扩展的条件;它只是扩展到(a) => foo(a, 1)
(§6.23)。常规类型推断不会试图找出 a: Int
.
关于scala - 在 Scala 中,为什么我不能在不明确指定参数类型的情况下部分应用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2363013/