gpt4 book ai didi

scala - 为什么在嵌套迭代器上展平无法编译,为什么我需要类型归属?

转载 作者:行者123 更新时间:2023-12-03 16:35:06 25 4
gpt4 key购买 nike

(new Iterator[List[Int]] {
def hasNext: Boolean = ???
def next(): List[Int] = ???
}).flatten

给出错误:
value flatten is not a member of Iterator[List[Int]]
[error] possible cause: maybe a semicolon is missing before `value flatten'?
[error] }.flatten
[error] ^
[error] one error found


(new Iterator[List[Int]] {
def hasNext: Boolean = ???
def next(): List[Int] = ???
}: Iterator[List[Int]]).flatten

作品。还将迭代器存储在 val 中。

斯卡拉版本:2.11.8

最佳答案

我相信这个问题是由 Include the parts of a compound/refinement type in implicit scope. #5867 解决的。问题是用于不符合隐式搜索条件的匿名类的伴随

I think aaf9198#diff-7c03397456d3b987549fd039d6b639c6R516 was the first to exclude refinement/anon classes from contributing to companion implicits. @odersky Can you remember the motivation?



这是一个最小的复制品
trait A {
def foo(): Int
}
class B {
def bar(): String = "woohoo"
}
object A {
implicit def aToB(a: A): B = new B
}

(new A {
override def foo(): Int = 42
}).bar()

// Error:
// value bar is not a member of A$A12.this.A
// possible cause: maybe a semicolon is missing before `value bar'? }).bar();

因此,由于在 2.11 和 2.12 flatten 上的 Iterator 是通过 flattenTraversableOnce 作为扩展方法提供的,因此匿名 Iterator 类会出现问题。

以下是我在上述编辑之前的回答:

它似乎与 2.11 和 2.12 中的隐式解析有关。如果您通过以下方式显式导入 flatten 作为扩展方法
import scala.collection.TraversableOnce.flattenTraversableOnce

那么它似乎工作。自 2.13.0-M3 以来,该问题似乎已解决,其中打字机阶段给出
collection.this.TraversableOnce.flattenTraversableOnce[Int, List]({
final class $anon extends AnyRef with Iterator[List[Int]] {
def <init>(): <$anon: Iterator[List[Int]]> = {
$anon.super.<init>();
()
};
def hasNext: Boolean = scala.Predef.???;
def next(): List[Int] = scala.Predef.???
};
new $anon()
})(scala.Predef.$conforms[List[Int]]).flatten


而在 2.13.0 版本中, flatten 似乎不再通过扩展方法提供
{
final class $anon extends AnyRef with Iterator[List[Int]] {
def <init>(): <$anon: Iterator[List[Int]]> = {
$anon.super.<init>();
()
};
def hasNext: Boolean = scala.Predef.???;
def next(): List[Int] = scala.Predef.???
};
new $anon()
}.flatten[Int](scala.Predef.$conforms[List[Int]])

上面的扩展好像是 SLS 6.4 Designators解释的

𝑒.𝑥 is typed as if it was { val 𝑦 = 𝑒; 𝑦.𝑥 }

关于scala - 为什么在嵌套迭代器上展平无法编译,为什么我需要类型归属?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62153578/

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