为什么我不能在 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)
}
如果我取消对指定行的注释,下面的代码将无法编译。编译器抱怨:"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)
}