sea*_*owg 9 compiler-construction types programming-languages scala type-inference
我有一段代码,我不能按照我喜欢的方式行事.我有一个以下面的方式定义的类(为此被剥离):
class Behaviour[T](private val rule: Time => T) {
def map1[U, V](behaviour: Behaviour[U], func: (T, U) => V): Behaviour[V] = {
new Behaviour(time => func(this.at(time), behaviour.at(time)))
}
}
Run Code Online (Sandbox Code Playgroud)
在玩这堂课的时候,我尝试了一些我认为微不足道的东西:
val beh = Behaviour(time => 5)
val beh2 = Behaviour(time => 5)
beh.map1(beh2, (a, b) => a + b)
Run Code Online (Sandbox Code Playgroud)
对于最后一行,我收到以下错误:
<console>:13: error: missing parameter type
beh.map1(beh2, (a, b) => a + b)
^
Run Code Online (Sandbox Code Playgroud)
我当然可以指定闭包参数类型,它可以正常工作,但为什么不在这里键入推理?当然,我也可以为函数指定泛型类型(请参阅下面的两个解决方案).
我认为Scala进行了一次'扫描'来推断类型,并且会看到beh2并传递给函数并假设U在这里Int.有没有什么方法可以解决这个问题,而无需指定输入参数的类型(对于闭包或泛型)?
编辑:我有两个修复示例:
beh.map1[Int, Int](beh2, (a, b) => a + b)
beh.map1(beh2, (a, b : Int) => a + b)
Run Code Online (Sandbox Code Playgroud)
Tra*_*own 19
请参阅此scala-debate主题以了解此处发生的情况.问题是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)
Run Code Online (Sandbox Code Playgroud)
f(y, z)完全按照我们的预期工作,但是g(y)(z)给出了类型不匹配,因为当编译器到达第二个参数列表时,它已经被选为Y类型A.
| 归档时间: |
|
| 查看次数: |
1779 次 |
| 最近记录: |