Scala 创建部分应用的函数时的类型推断

Scala 创建部分应用的函数时的类型推断,scala,type-inference,Scala,Type Inference,当我这样做时: def x(i: Int, i2: Int, i3: Int) = i x(_: Int, _: Int, 3) 为什么我必须指定前两个参数为“Int” 有没有办法让编译器推断类型,以便我可以键入: x(_, _, 3) 简短回答: 除非需要函数类型,否则必须明确匿名函数的参数类型。“部分应用程序”只是创建匿名函数的一种语法糖 长答案: 首先,请注意,在部分应用x时,不必总是提供类型参数。考虑这个例子: def x(i: Int, i1: Int, i2: Int) =

当我这样做时:

def x(i: Int, i2: Int, i3: Int) = i

x(_: Int, _: Int, 3)
为什么我必须指定前两个参数为“Int”

有没有办法让编译器推断类型,以便我可以键入:

  x(_, _, 3)

简短回答:

除非需要函数类型,否则必须明确匿名函数的参数类型。“部分应用程序”只是创建匿名函数的一种语法糖

长答案:

首先,请注意,在部分应用
x
时,不必总是提供类型参数。考虑这个例子:

def x(i: Int, i1: Int, i2: Int) = i

def g(f: (Int, Int) => Int) = f(1, 2)

// types are inferred!
g(x(_, _, 3)) // evaluates to 1

// again, types are inferred
val f: (Int, Int) => Int = x(_, _, 3)
因此,很明显,在一个需要
(Int,Int)=>Int
的上下文中,这会有所帮助

其次,请注意,您正在定义一个匿名函数。您可以更明确地这样写:

(a, b) => x(a, b, 3) 
通过这种方式编写,应该更清楚的是,定义上下文(即,作为一个单独的表达式)不会对匿名函数的类型设置任何期望。另一方面,在
g
的应用中,
g
的参数类型意味着对特定函数类型的期望

原则上,编译器可以从
x
的类型推断
a
b
的类型,但它不能,如本手册§6.23所述(粗体强调添加):

匿名函数(x1:t1,…,xn:Tn)= > e将类型TI的参数席映射到表达式E给出的结果。[……]

如果匿名函数的期望类型是Scala函数[S1,…,SN,R],则期望的E类型为R,并且可以省略任何参数席的TI,在这种情况下,假设Ti=SI。strong>如果匿名函数的预期类型是其他类型,则必须显式指定所有形式参数类型,并且预期的e类型未定义


这很可能与编译器有足够的信息有关,但推理的流程受到限制,以使实现更简单。@om nom nom,除了这里没有多态性。。。