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

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

如果我取消对指定行的注释,下面的代码将无法编译。编译器抱怨:"stable identifier required".

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,它就可以工作,但感觉很奇怪,如果没有这样的 hack 就无法对这样的基本值进行模式匹配。

我是不是漏掉了什么?

您不能 "pattern match" 不是常量的变量
Stream.empty 不是 "stable" 标识符,因为它代表某种方法:

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

可能随时 return 任何值。
编译器不知道它的 returned 值总是 Empty,所以它检测它作为一个潜在的变化 变量.
太深了,它无法检测到它。

但是,当您将方法的结果分配给 val(由于不可变而成为稳定的标识符)时,您的代码能够使用它处理模式匹配。

您可能会阅读 this,提出一个假设来解释为什么模式匹配需要一个稳定的标识符。

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

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

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