鉴于
def sum(a: Int, b: Int) = a + b
val add7 = sum(7, _)
// compiler complains missing $x1's type for $x1 => sum(7, $x1)
val add8 = sum(8, _: Int)
// fine
curried sum
可以在没有类型声明的情况下执行此操作。
def sum_curry(a: Int)(b: Int) = a + b
val add9 = sum_curry(9)(_)
// fine
但它不是通用函数,可以知道sum的参数类型是什么,它已经存在。
为什么Scala不能在b: Int
的签名中知道sum
中的$ x1类型?
答案 0 :(得分:0)
编译器需要知道函数参数的数据类型,以便将函数调用映射到一个函数定义(在具有相同名称的许多重载函数定义中)
如果我们尝试从函数定义到函数调用的反向映射来确定函数调用中参数的类型,那么它将变得模棱两可。
答案 1 :(得分:0)
Eta表达式只有在以下情况下才能将其转换为值类型(Int, Int) => Int
:
_
代替list
val f = sum _
或者,您只需省略参数列表。
val f:(Int,Int)=> Int = sum
并指定其类型。
或使用每个_
val f = sum(_,_)
如您所见,sum(7, _)
无法满足上述任何要求。