繁体   English   中英

为什么我不能在Scala中的Stream.empty上进行模式匹配?

[英]Why can't I pattern match on Stream.empty in Scala?

如果我取消注释指示的行,则下面的代码不会编译。 编译器抱怨:“需要稳定的标识符”。

val Empty = Stream.empty    
val a = Stream.range(0, 5)
a match {
  // case Stream.empty => println("nope") <-- does not work
  case Empty => println("compiles") <-- works
  case _ => println("ok")
}

如果我首先将Stream.empty分配给值Empty ,它可以工作,但是如果没有这样的黑客,你就不能在这样的基本值上进行模式匹配。

我错过了什么吗?

你不能在Stream.empty上进行模式匹配,因为它是一个总是返回空流的方法 (在对象Stream )(但编译器不知道这一点)。

而不是分配val empty = Stream.empty ,您可以匹配Stream.Empty ,它是一个Object

scala> a match {
           case Stream.Empty => println("done")
           case h #:: tl => println(h)
       }

您不能对不是常量变量进行 “模式匹配”。
Stream.empty不是“稳定”标识符,因为它代表了一些方法:

/** The empty stream */
  override def empty[A]: Stream[A] = Empty

这可能会随时返回任何值。
编译器不知道其返回值始终为Empty ,因此它将其检测为潜在的更改变量
太深了,无法检测到它。

但是,当您将方法的retult分配给val (因为不可变时是一个稳定的标识符)时,您的代码可以使用它来处理模式匹配。

您可能会读到这一点 ,引发一个假设,解释为什么模式匹配需要一个稳定的标识符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM