如何在Scala中理解“与Singleton对象的模式匹配”?

多拉蒙

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

例如,如果我要实现自己的列表结构,例如

// 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方法的不同有关,但是编译器给出的消息极具误导性。这是否意味着在外部“匹配”时需要像xs.asInstanceOf [AList [Int]]一样显式转换xs?

塞尼亚

编译器告诉您,类型xsCons,不能为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

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 {
                          ^

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Spark Scala中处理模式匹配中的Null

来自分类Dev

如何在Scala中取消模式匹配中的类型?

来自分类Dev

如何在Scala中对多个类型进行模式匹配?

来自分类Dev

如何在Scala中对功能进行模式匹配?

来自分类Dev

用于理解的Scala模式匹配

来自分类Dev

在 Scala 的模式匹配器中访问匹配的对象

来自分类Dev

如何在单个项目存在的列表理解中减少模式匹配的样板

来自分类Dev

在Scala中,如何检查MouseEvent对象上的模式匹配是否单击了特定组件?

来自分类Dev

如何在scala中的foreach函数中的正则表达式上进行模式匹配?

来自分类Dev

如何在Scala中读取匹配模式的前一行?

来自分类Dev

如何在Java中检查匹配模式

来自分类Dev

如何在 SML 中模式匹配 0.0?

来自分类Dev

Scala如何在非通用LazyList中使用模式匹配?

来自分类Dev

如何在数组上进行scala模式匹配?

来自分类Dev

如何在Scala中匹配Char?

来自分类Dev

如何在 PowerShell 中选择匹配特定模式的对象

来自分类Dev

如何在Java中制作同步的Singleton设计模式?

来自分类Dev

如何在匹配模式中获取case类的匹配实例

来自分类Dev

如何在匹配模式中获取case类的匹配实例

来自分类Dev

Scala中的模式匹配或isInstanceOf

来自分类Dev

模式匹配中的Scala Regex

来自分类Dev

Scala中POJO的模式匹配?

来自分类Dev

Scala:元组中的模式匹配

来自分类Dev

Scala 中奇怪的模式匹配

来自分类Dev

Spark Scala 中的模式匹配

来自分类Dev

如何使用模式匹配在scala中获取nonEmpty列表?

来自分类Dev

标对象上的Scala模式匹配

来自分类Dev

将对象 (Any) 与 Scala Map 匹配的模式

来自分类Dev

案例表达/列表理解中的模式匹配

Related 相关文章

热门标签

归档