gpt4 book ai didi

scala - 如何理解scala中的 "pattern match with Singleton object"?

转载 作者:行者123 更新时间:2023-12-02 21:39:34 24 4
gpt4 key购买 nike

我的问题的背景与论坛中其他人提出的问题类似,但我找不到完全匹配的内容,在查看这些答案后,这对我来说仍然是一个谜。因此,如果有人可以提供帮助,我将不胜感激。我的问题的上下文是使用模式匹配来匹配单例类对象。

例如,如果我正在实现自己的列表结构,如下所示

// An implementation of list
trait AList[+T] // covariant
case class Cons[+T](val head: T, val tail: AList[T]) extends AList[T]
case object Empty extends AList[Nothing] // singleton object

// an instance of implemented list
val xs = Cons(1, Cons(2, Cons(3, Empty)))

// pattern matching in a method - IT WORKS!
def foo[T](xs: AList[T]) = xs match {
case Empty => "empty"
case Cons(x, xss) => s"[$x...]"
}
println(foo(xs)) // => [1...]

// pattern matching outside - IT RAISES ERROR:
// pattern type is incompatible with expected type;
// found : Empty.type
// required: Cons[Nothing]
val r: String = xs match {
case Empty => "EMPTY"
case Cons(x, xss) => s"[$x...]"

}
println(r) // does NOT compile

对我来说,它们看起来像是相同“对象”上的相同“匹配”,为什么一个有效而另一个失败?我猜这个错误与匹配 expr in 和 out of 方法的不同有关,但编译器给出的消息非常具有误导性。这是否意味着我们需要在外部“匹配”时显式转换 xs,如 xs.asInstanceOf[AList[Int]] ?

最佳答案

编译器告诉您 xs 的类型是 Cons 并且它不能是 Empty,所以您的第一个 case 毫无意义。

试试这个:

val r: String = (xs: AList[Int]) match {
case Empty => "EMPTY"
case Cons(x, xss) => s"[$x...]"
}

或者这个:

val ys: AList[Int] = xs
val r: String = ys match {
case Empty => "EMPTY"
case Cons(x, xss) => s"[$x...]"
}

在这种情况下,编译器不知道 case Empty 是没有意义的。

这正是您使用 def foo[T](xs: AList[T]) = ... 所做的事情。使用 def foo[T](xs: Cons[T]) = ... 会出现相同的编译错误。

在此特定示例中,有效且详尽的匹配如下所示:

val r: String = xs match {
// case Empty => "EMPTY" // would never happened.
case Cons(x, xss) => s"[$x...]"
}

添加:您应该将您的 AList 特征密封:

sealed trait AList[+T]

它允许编译器警告您不详尽的匹配:

val r: String = (xs: AList[Int]) match {
case Cons(x, xss) => s"[$x...]"
}
<console>:25: warning: match may not be exhaustive.
It would fail on the following input: Empty
val r: String = (xs: AList[Int]) match {
^

关于scala - 如何理解scala中的 "pattern match with Singleton object"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20676947/

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