使用视图时匹配错误

发布于 2024-12-11 02:15:37 字数 786 浏览 0 评论 0原文

List(1,2,3,4).sliding(2).map({ case List(a, b) => a < b }).forall(identity)

编译并返回 true (尽管有一个匹配不详尽的警告)。

List(1,2,3,4).view
   .sliding(2).map({ case List(a: Int, b: Int) => a < b }).forall(identity)

编译(只要我们包含 ab 的类型注释),但会抛出 MatchError:

scala.MatchError: SeqViewC(...) (of class scala.collection.SeqViewLike$$anon$1)
        at $anonfun$1.apply(<console>:12)
        at $anonfun$1.apply(<console>:12)
        at scala.collection.Iterator$$anon$19.next(Iterator.scala:335)
        at scala.collection.Iterator$class.forall(Iterator.scala:663)
        at scala.collection.Iterator$$anon$19.forall(Iterator.scala:333)

Why?

List(1,2,3,4).sliding(2).map({ case List(a, b) => a < b }).forall(identity)

compiles and returns true (albeit with a warning that the match is not exhaustive).

List(1,2,3,4).view
   .sliding(2).map({ case List(a: Int, b: Int) => a < b }).forall(identity)

compiles (so long as we include the type annotations for a and b) but throws a MatchError:

scala.MatchError: SeqViewC(...) (of class scala.collection.SeqViewLike$anon$1)
        at $anonfun$1.apply(<console>:12)
        at $anonfun$1.apply(<console>:12)
        at scala.collection.Iterator$anon$19.next(Iterator.scala:335)
        at scala.collection.Iterator$class.forall(Iterator.scala:663)
        at scala.collection.Iterator$anon$19.forall(Iterator.scala:333)

Why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寄人书 2024-12-18 02:15:37

有趣的是,列表提取器 List.unapplySeq 无法提取 SeqViewLike 对象,这就是您收到匹配错误的原因。但另一方面,Seq 可以。您可以这样看到:

scala> val seqView = List(1,2).view.sliding(2).next
seqView: scala.collection.SeqView[Int,List[Int]] = SeqViewC(...)

scala> val List(a, b, _*) = seqView

scala.MatchError: SeqViewC(...) 

scala> val Seq(a, b, _*) = seqView
a: Int = 1
b: Int = 2

因此,对第二行的修复是:

List(1,2,3,4).view.sliding(2).map({ case Seq(a, b) => a < b }).forall(identity)
// res: Boolean = true

所以问题是 List(1,2,3,4).view 返回一个 SeqView

请注意,sliding 已经返回一个 Iterator,因此 List(1,2,3,4).sliding(2) 是惰性的。可能view不是必需的。

That's interesting, the list extractor List.unapplySeq is not able to extract SeqViewLike objects, which is why you get a match error. But on the other hand Seq can. You can see that like this:

scala> val seqView = List(1,2).view.sliding(2).next
seqView: scala.collection.SeqView[Int,List[Int]] = SeqViewC(...)

scala> val List(a, b, _*) = seqView

scala.MatchError: SeqViewC(...) 

scala> val Seq(a, b, _*) = seqView
a: Int = 1
b: Int = 2

So a fix to your second line would be:

List(1,2,3,4).view.sliding(2).map({ case Seq(a, b) => a < b }).forall(identity)
// res: Boolean = true

So the issue is that List(1,2,3,4).view returns a SeqView.

Note that sliding already returns an Iterator, so List(1,2,3,4).sliding(2) is lazy is that sense. May be view is not necessary.

︶ ̄淡然 2024-12-18 02:15:37

好吧,列表的视图不是列表,它是一个 SeqView,它是一个 Seq。下面的做法是正确的:

List(1,2,3,4).view
   .sliding(2).map({ case Seq(a: Int, b: Int) => a < b }).forall(identity)

Well, a view of a list is not a list, it is a SeqView, which is a Seq. The following does the right thing:

List(1,2,3,4).view
   .sliding(2).map({ case Seq(a: Int, b: Int) => a < b }).forall(identity)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文