gpt4 book ai didi

list - 为什么 Scala 列表类名为::

转载 作者:行者123 更新时间:2023-12-03 22:49:11 24 4
gpt4 key购买 nike

为什么 scala 列表实现名为::而不是类名?这背后有什么特殊含义吗?

最佳答案

链表由两种情况组成:cons 单元格(有头和尾)和空列表。这些案例被称为 ::Nil分别在 Scala 中,就像在其他具有 ML 传统的语言中一样。在不可变的实现中,最自然的编码看起来像这样:

sealed trait List[+A]

case class Cons[+A](head: A, tail: List[A]) extends List[A]
case object Nil extends List[Nothing]

这工作得很好,而且真的没有任何问题。您可以定义一个 ::方法在 List (或 prepend ,如果您愿意),一切都如您所愿。在这种情况下, List的“具体实现”将是 Cons ,虽然在技术上两者都是 ConsNil是具体的实现。

但问题是:我们希望能够在 List 的实例上进行模式匹配取回内容。就目前情况而言,该模式匹配将需要以下语法:
def sum(xs: List[Int]): Int = xs match {
case Cons(hd, tl) => hd + sum(tl)
case Nil => 0
}

不过这有点难看。我们真正想要的是能够使用 ::我们模式匹配中的操作符与我们最初构造列表时使用的操作符相同。这就是为什么 Cons类名为 :: .

通过定义一个包含两个参数的 case 类,我们基本上是在告诉 Scala 我们希望它允许我们使用该 case 类作为模式匹配中的中缀提取器。尾随的冒号使提取器右关联,为我们提供预期的语法:
sealed trait List[+A]

case class ::[+A](head: A, tail: List[A]) extends List[A]
case object Nil extends List[Nothing]

def sum(xs: List[Int]): Int = xs match {
case hd :: tl => hd + sum(tl)
case Nil => 0
}

这就是为什么 List 的任何实例具有内容的将是类 :: 的一个实例,因为那是 List 的非空实现.

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

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