gpt4 book ai didi

scala - 使用 View 时出现匹配错误

转载 作者:行者123 更新时间:2023-12-04 13:34:21 26 4
gpt4 key购买 nike

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)

为什么?

最佳答案

有趣的是,列表提取器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

关于scala - 使用 View 时出现匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7856657/

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