list - 为什么::仅适用于列表?

标签 list scala collections cons

制作背后的原因是什么::特定于 List并且不适用于 Seq 的所有子类?举个具体的例子:

// :: for pattern matching
def getTail[E](s: Seq[E]): Seq[E] = s match {
   case head :: tail => tail
   case empty => empty
}
getTail(Seq(1, 2)) // returns List(2) as expected
getTail(Seq()) // returns List() as expected
getTail(Queue(1, 2)) // returns Queue(1, 2), not Queue(2)
getTail(Buffer(1, 2)) // returns ArrayBuffer(1, 2), not ArrayBuffer(2)

// :: for building sequences
1 :: 2 :: 3:: Nil // Creates List(1, 2, 3)
1 :: 2 :: List(3) // same as above
1 :: 2 :: Queue(3) // does not compile. :: is not a method within Queue

所有序列都是有序的,并有“头”和“尾”的概念,那么为什么集合库的实现者只提供::List ?为什么我必须使用 +:如果我想与所有人一起工作 Seq ?

编辑:我理解性能论点——几乎每次我问这个问题时我都会得到它——但我在很大程度上不同意它。想象一个不同的收藏库,其中只有一件事发生了变化:删除 ::来自 List .会发生什么变化?
  • 我仍然可以使用 +: 以高效的方式构建我的列表和 Nil"A" +: "B" +: Nil .
  • 我仍然可以使用 +: 优雅地进行模式匹配提取我列表的不同部分。例如case head +: tail => println(head)
  • 有一个统一的方法来构建和模式匹配 Seq 的所有子类.这消除了我在 getTail 中介绍的那种使用 linter 来查找细微错误的需要。 .

  • 老实说,我不明白 List 有多么独特的方法使任何事情都比使用 +: 更容易、更清晰或更高效.如果是这样,那么我看不到 :: 的理由。具体到List .鉴于此,我看不出 :: 的原因根本存在。

    最佳答案

    与所有特定于类的运算符背后的推理相同。赞 #::Stream!Actor .

    List是单链接的,前置元素,解构为 head + tail 在 O(1) 中执行。它基本上是列表最常用的操作。 List 的整个思想就是围绕这个操作构建的。

    请注意,List支持 Seq+:以及。但是使用 ::清楚地表明您的使用意图 List以有效的方式。

    关于list - 为什么::仅适用于列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33309223/

    相关文章:

    c# - List.Contains 是否完全等同于 List.IndexOf?

    python - 清理数据 : How to iterate through a list find if item contains a string, 空白或空白并在 Python 中删除该项目

    list - 普通口齿不清 : all or any elements are true in a list

    Scala 循环有多个条件 - 返回什么?

    scala - 如何创建一个以spark.broadcast[Map]作为参数的方法?

    c# - 在 C# 中使用反射添加到未知类型的集合

    Java列表,按3组计算对象的非零属性

    c# - Linq - 对列表的列表进行操作

    scala - 使用事件处理程序配置 akka 记录器的记录器名称

    java - C# 通用通配符