抽象数据类型和代数数据类型之间的区别

时间:2017-03-16 11:49:01

标签: scala

有人可以告诉我,抽象数据类型和代数数据类型之间有什么区别吗?

2 个答案:

答案 0 :(得分:8)

代数数据类型是由总和和产品组成的类型(不同的构造函数和具有多个字段的构造函数)。抽象数据类型是一种数据类型,其实现由定义的API抽象化......通常对其实现进行某种封装。

例如,优先级队列是抽象数据类型。在内存中,它可以实现为数组,或堆上的已分配单元格,或C中的结构,或莎士比亚十四行诗。但是,您使用定义良好的界面对其进行抽象:push和pop。您可以优先将项目推入队列,并且可以随时弹出最高优先级项目。 另一个例子是关联映射或字典,它可以用散列,二叉搜索树或训练有素的海獭来实现。重要的是您定义了对底层实现进行抽象的查找,插入和删除操作。

所以他们真的在谈论根本不同的事情。实际上,某些数据结构可以看作是作为代数数据类型实现的抽象数据类型!与Prelude中的commom链表抽象数据类型一样,它实现为[]代数数据类型。它提供的界面是消耗和消失,但它实现为多个构造函数,其中一个具有多个字段 - 总和和产品。

答案 1 :(得分:4)

我假设您指的是抽象类型和代数数据类型。 Scala中的大多数人都参考sum types的ADT(代数数据类型)。 [产品类型]也是代数数据类型。一个非常简单的例子是树(您实际上已经在之前的一个问题中定义了它):

sealed abstract class Tree[+A]
case object Leaf extends Tree[Nothing]
case class Branch[A](left: Tree[A], right: Tree[A], value: A) extends Tree[A]

Scala中的抽象类型可以通过在特征/抽象类中使用未定义的类型别名来定义,以实现粒度表示。这个问题已经回答here

抽象类型通常用于隐藏有关组件内部结构的信息,因此基本上用于抽象某些组件的具体类型。尝试使用抽象类型重写树表示形式,如下所示:

sealed trait Tree {
  type A
}
case object Leaf extends Tree {
  override type A = Nothing
}
case class Branch(left: Tree, right: Tree) {
  // This doesn't really make sense, we don't want to hide A!
  override type A = ???
}

最后,抽象类型更多是Scala类型系统的一个特性(在本例中),而代数数据类型只是定义复合类型的一种形式,并且独立于编程语言。