Scala 未推断多参数闭包参数类型

Scala 未推断多参数闭包参数类型,scala,compiler-construction,types,programming-languages,type-inference,Scala,Compiler Construction,Types,Programming Languages,Type Inference,我有一段代码,我不能以我喜欢的方式行事。我用以下方式定义了一个类(为此进行了精简): 在这门课上玩的时候,我试着做一些我认为很琐碎的事情: val beh = Behaviour(time => 5) val beh2 = Behaviour(time => 5) beh.map1(beh2, (a, b) => a + b) 对于最后一行,我收到以下错误: <console>:13: error: missing parameter type

我有一段代码,我不能以我喜欢的方式行事。我用以下方式定义了一个类(为此进行了精简):

在这门课上玩的时候,我试着做一些我认为很琐碎的事情:

val beh = Behaviour(time => 5)
val beh2 = Behaviour(time => 5)
beh.map1(beh2, (a, b) => a + b)
对于最后一行,我收到以下错误:

<console>:13: error: missing parameter type
          beh.map1(beh2, (a, b) => a + b)
                             ^

解决此问题的方法之一是定义多个参数列表。因此,您的
map1
方法的定义如下:

def map1[U, V](behaviour: Behaviour[U])(func: (T, U) => V): Behaviour[V] = ...
beh.map1(beh2)((a, b) => a + b)
beh.map1(beh2)(_ + _)
您可以这样使用它:

def map1[U, V](behaviour: Behaviour[U])(func: (T, U) => V): Behaviour[V] = ...
beh.map1(beh2)((a, b) => a + b)
beh.map1(beh2)(_ + _)
我不完全确定为什么类型推断在您的案例中不起作用,但我相信它与
U
type参数的使用有关。您使用它两次-第一个和第二个参数。这可能太复杂了,编译器无法理解。如果有两个参数列表,
U
将在第一个参数列表编译期间进行推断,第二个参数列表将使用已推断的类型

有关这里发生的事情的讨论,请参阅。问题是Scala的类型推断是按参数列表进行的,而不是按参数进行的

正如Josh Suereth在那篇文章中指出的那样,当前的方法有一个很好的理由。如果Scala具有每参数类型推断,编译器无法推断同一参数列表中不同类型的上限。考虑以下事项:

trait X
class Y extends X
class Z extends X

val y = new Y
val z = new Z

def f[A](a: A, b: A): (A, A) = (a, b)
def g[A](a: A)(b: A): (A, A) = (a, b)

f(y,z)
的工作方式与我们预期的完全一样,但是
g(y)(z)
给出了一个类型不匹配,因为当编译器到达第二个参数列表时,它已经被选为
y
作为
a
的类型,非常感谢,这工作得很好!如果没有人能解释第二天发生的事情,我就接受这个答案。