“之间的Scala差异”+;:&引用;“和”:&引用;

“之间的Scala差异”+;:&引用;“和”:&引用;,scala,Scala,我正在读一本scala的书,他们在序列和列表上进行模式匹配时使用了两种不同类型的cons运算符 +: :: 通常大多数函数式语言使用:作为cons。我不知道为什么scala有两种不同类型的操作符来代替cons 我也在谷歌上搜索了这个。。。但没有发现任何有意义的东西 谢谢你下面的回答。我从中了解到,+:是一个通用运算符,:是列表的专用运算符。但我可能还有一个后续问题,那就是为什么scala会使用两个操作符。为什么不只用一个: final case class ::[B](override va

我正在读一本scala的书,他们在序列和列表上进行模式匹配时使用了两种不同类型的cons运算符

+:

::
通常大多数函数式语言使用
作为cons。我不知道为什么scala有两种不同类型的操作符来代替cons

我也在谷歌上搜索了这个。。。但没有发现任何有意义的东西

谢谢你下面的回答。我从中了解到,
+:
是一个通用运算符,
是列表的专用运算符。但我可能还有一个后续问题,那就是为什么scala会使用两个操作符。为什么不只用一个

final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
  override def tail : List[B] = tl
  override def isEmpty: Boolean = false
}


这就清楚了-接受列表并生成列表,而+:是更通用的形式,可以构建其他集合,如VectorArrayBuffer

至于您的后续问题
更多地是早期Scala实现的遗留,它试图与现有函数语言具有类似的syntex。
使用
+:
哪个更一致。

但为什么要使用2?大多数其他函数式语言只有
,它可以处理列表、向量和数组缓冲区。对于列表和向量和数组缓冲区,需要一种专门的形式,而对于向量和数组缓冲区,需要其他更通用的形式吗?“大多数其他函数式语言只有::并且它可以处理列表、向量和数组缓冲区”-我怀疑这是真的。你想要什么语言?我用F#编写了一点代码(我相信它与OCAML非常相似)。根据我的记忆,我总是使用
。我不是专家。。。
override def +:[B >: A, That](elem: B)(implicit bf: CanBuildFrom[List[A], B, That]): That = bf match {
  case _: List.GenericCanBuildFrom[_] => (elem :: this).asInstanceOf[That]
  case _ => super.+:(elem)(bf)
}