缺少"代数数据类型"的定义,在"了解大好的Haskell"一书中

jhe*_*dus 0 haskell types

我正在阅读Learn You a Haskell,似乎作者没有明确定义"代数数据类型"这个术语的含义.该术语首次出现在本书PDF版本的第126页,并且在首次出现之前没有明确的定义.

有人可以按照本书的精神填写这个缺失的定义吗?

换句话说,有人会根据本书前126页中包含的信息给出一个可以理解的简单定义吗?

我怀疑代数数据类型是由关键字"数据"定义的任何内容,但我并非100%确定.

我知道网上有很多关于代数数据类型的解释,但我想知道代数数据类型在本书的上下文中意味着什么.谢谢阅读.

编辑:这不是关于"代数"这个名字的问题.这是关于ADT一词缺失定义的问题.换句话说,本书没有清楚地解释ADT是否与"数据"相同.这是.但这本书令人困惑,并没有建立这种联系.这就是这个问题,而不是"代数"这个词.这个名字也可能是"斑马数据类型",问题也是一样的.

Aad*_*hah 7

代数数据类型之所以被称为是因为它们形成了类型的代数.这个代数包含两个原始操作:

  1. 产品

这里的乘积和求和运算与布尔代数逻辑联合(逻辑AND)和逻辑分离(逻辑OR)运算是同构的.


类型的产品是类型的逻辑结合.例如考虑:

data Person = Person { name   :: String
                     , age    :: Int
                     , gender :: Char
                     }
Run Code Online (Sandbox Code Playgroud)

这里的数据构造函数Person是类型的结合String,IntChar.这意味着,它是由一个String 一个Int 一个Char.因此它是这些类型的产品:

data Person = Person (String * Int * Char)
Run Code Online (Sandbox Code Playgroud)

这种数据类型称为产品类型.产品类型几乎适用于所有语言.例如,在C中,产品类​​型称为a struct.


类型的总和是类型的逻辑分离.例如考虑:

data Race = Dwarf | Elf | Hobbit | Human
Run Code Online (Sandbox Code Playgroud)

这里的数据类型Race是数据构造的析取Dwarf,Elf,HobbitHuman.这意味着它可以是a Dwarf a Elf a Hobbit a Human.因此它是这些类型的总和:

data Race = Dwarf + Elf + Hobbit + Human
Run Code Online (Sandbox Code Playgroud)

这种数据类型称为和类型.Sum类型几乎适用于所有语言.例如,在C中,求和类型称为a union.在Java中它被称为enum.


代数数据类型非常强大,因为它们允许您轻松创建产品和总和类型.例如考虑:

data Shape = Circle { x :: Double
                    , y :: Double
                    , r :: Double
                    }
           | Rectangle { x1 :: Double
                       , y1 :: Double
                       , x2 :: Double
                       , y2 :: Double
                       }
Run Code Online (Sandbox Code Playgroud)

这里的数据类型Shape是数据构造的总和CircleRectangle这反过来的产品类型Double ^ 3Double ^ 4分别.

在Haskell和其他函数式编程语言中创建这样的"代数"数据类型是简洁的.但是,在C和Java等语言中创建这样的数据类型是笨拙和冗长的.

  • Java`enum`是一种较弱的sum类型(每个术语都是一个主要因素).例如,`Race`数据类型可以建模为Java枚举.但是`Shape`数据类型不能.尽管如此,"枚举"仍被视为总和类型.它不是产品的总和,但它仍然是一笔钱. (2认同)