为什么我需要在已知类型参数上表示部分应用函数的类型?

时间:2015-05-09 05:34:39

标签: scala

鉴于

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类型?

2 个答案:

答案 0 :(得分:0)

编译器需要知道函数参数的数据类型,以便将函数调用映射到一个函数定义(在具有相同名称的许多重载函数定义中)

如果我们尝试从函数定义到函数调用的反向映射来确定函数调用中参数的类型,那么它将变得模棱两可。

答案 1 :(得分:0)

Eta表达式只有在以下情况下才能将其转换为值类型(Int, Int) => Int

  • _代替list

    的参数

    val f = sum _

  • 或者,您只需省略参数列表。

    val f:(Int,Int)=> Int = sum

并指定其类型。

  • 或使用每个_

    val f = sum(_,_)

如您所见,sum(7, _)无法满足上述任何要求。