要学的东西太多了。你首先需要了解什么是对象,什么是类,什么是接口/特征,什么是值,什么是类型。然后有了这些,您可能需要了解ADT。
我会尽量快速回答这个问题。
List
数据类型定义为
sealed trait List[+A]
final case class ::[+A](head: A, tail: List[A]) extends List[A]
final case object Nil extends List[Nothing]
所以在这里我们可以看到三样东西:一个trait,一个class和一个object。
- 类是用于创建对象(也称为实例)的内存蓝图。它不是一个值,要使用它,您必须调用它的构造函数(在这种情况下,它接收两个值, the和 the )来获取该类的新值。
head
tail
- 对象就像一个已经实例化的匿名类,因此它已经是一个值,您可以按原样使用它。
- 一个trait就像一个不能被实例化的类,它被称为是抽象的。它用于定义所有子类必须遵循的常见行为。
此外,当特征是密封的并且类和对象是cases
时,我们称这些ADT (代数数据类型)。
不要让花哨的名字吓到你,它只是意味着特征代表一个单一的类型(在这种情况下是 List)并且所有的情况都代表这种类型的部分。
ADT 由乘积和总和组成,总和代表备选方案(它是 A 或 B),乘积代表连词(它是 A 和 B)。
在List的情况下,我们说它要么是空列表( Nil
) ,要么是具有自己的头部和尾部的 cons ( ::
) ,其中尾部是另一个列表。
有了这一切,并且知道 Scala 有一个语法技巧来允许在中间使用符号名称,您可以看到:
val list = 1 :: 2 :: 3 :: Nil
是相同的:
val list = new ::(
head = 1,
tail = new ::(
head = 2,
tail = new ::(
head = 3,
tail = Nil
)
)
)
奖金:
- 类型多于类。
null
它是Null类型 的值(习惯这种类型的唯一值),它是所有AnyRef类型的子类型。然而,它是一种特殊的价值。因为如果您尝试以任何方式对其进行操作,它将失败。我的建议,忘记它的存在,这是一个错误,它只存在于Java互操作中。如果您需要建模没有值,请使用Option
.