gpt4 book ai didi

scala - 为什么 Scala 编译器不使用抽象类型推断类型

转载 作者:行者123 更新时间:2023-12-01 05:09:08 25 4
gpt4 key购买 nike

鉴于以下代码

trait A { type B }
case class C extends A { type B = String }
def f[V <: A](b: V#B => V) = b

这个编译
f[C](a => new C())

但是为什么这个不能编译?
f(a => new C())

最佳答案

如果它推断出一个参数列表中的类型,则该约束将用于右侧的后续参数列表。 (请参阅有关 SO 的许多类似问题。)

但是在参数列表中不会发生类似的事情。

这也不起作用:

scala> def g[V <: A](b: V => V#B) = b
g: [V <: A](b: V => V#B)V => V#B

scala> g((c: C) => "")
<console>:11: error: type mismatch;
found : String("")
required: ?#B
?表示它还没有修复 V ,即使它刚刚解决了 V .

对比:
scala> def k[V <: A](v: V)(f: V#B => V) = 42
k: [V <: A](v: V)(f: V#B => V)Int

scala> k(new C)(_ => new C)
res5: Int = 42

当前使用的选项是 -Ytyper-debug .有时可以理解输出。

以您为例 f(_ => new C) ,您可以立即在 x$1 上看到它失败,即使有人希望它回溯并纠正自己。
|    |    |    |    |-- ((x$1) => new C()) : pt=?#B => ? BYVALmode-EXPRmode-POLYmode (site: value res0  in $iw) 
<console>:11: error: missing parameter type
f(_ => new C)
^
| | | | | |-- new C() EXPRmode (site: value $anonfun in $iw)
| | | | | | |-- new C BYVALmode-EXPRmode-FUNmode-POLYmode (silent: value $anonfun in $iw)
| | | | | | | |-- new C EXPRmode-POLYmode-QUALmode (silent: value $anonfun in $iw)
| | | | | | | | |-- C FUNmode-TYPEmode (silent: value $anonfun in $iw)
| | | | | | | | | \-> C
| | | | | | | | \-> C
| | | | | | | \-> ()C
| | | | | | \-> C
| | | | | \-> <error> => C
| | | | solving for (V: ?V)
| | | | \-> C#B => C

还有

http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#local-type-inference

关于scala - 为什么 Scala 编译器不使用抽象类型推断类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26288385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com