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,除了这里没有多态性。。。