scala类型系统:case class与代数数据类型

ADT(algebraic data type) 是很多函数式编程语言中支持的一种类型。不清楚最初是否来自haskell。

《Programming in Scala》中文版,在术语表中有提到ADT:

通过提供若干个含有独立构造器的备选项(alternative)来定义的类型。通常可以辅助于通过模式匹配解构类型的方式。这个概念可以在规约语言和函数式语言中发现。代数数据类型在Scala中可以用样本类(case class)模拟。

参考wiki:http://en.wikipedia.org/wiki/Algebraic_data_type

在计算机编程、特别是函数式编程与类型理论中,代数数据类型(ADT)是一种组合类型(composite type).例如,一个类型由其它类型组合而成。两个常见的代数类型是product(乘积)类型(比如tuplesrecords)和sum类型,它也被称为”tagged unions”或”variant type”

ADT最大的价值是用于“模式匹配”,即解构一个对象。

我们看看Scala怎么用case class模拟ADT,比如一副扑克按花色来分类:

sealed abstract class Suit
case class Heart(value: Int) extends Suit
case class Diamond(value: Int) extends Suit
case class Spade(value: Int) extends Suit
case class Club(value: Int) extends Suit

当然case class的构造参数并没有限制,比如下面这个描述一棵树的节点和叶子:

sealed abstract class Tree
case class Node(left: Tree, right: Tree) extends Tree
case class Leaf[A](value: A) extends Tree
case object EmptyLeaf extends Tree

关于case class更多细节请参考模式匹配系列blog。

scala类型系统:case class与代数数据类型》上有2条评论

  1. dd

    类型定义的语法上差 ml 和 hs 太多了. 不知道是怎么设计决策的

    回复
    1. lcn

      hs没有subtyping,ml搞的是另一种polymorphism,也不是subtyping:http://stackoverflow.com/a/22533286/2073130。你觉得的语法差太多,就这一个原因,看你觉得是不是错误决策。

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注