我正在阅读Learn You a Haskell并且似乎作者没有明确定义术语'代数数据类型' 指的是。该术语首次出现在本书PDF版本的第126页,并且在首次出现之前没有明确的定义。
有人可以根据本书的精神填写这个缺失的定义吗?
换句话说,有人会根据本书前126页中包含的信息给出一个可以理解的简单定义吗?
我怀疑代数数据类型是由关键字'数据'定义的任何内容。但我并非百分之百确定。
据我所知,网上有很多关于代数数据类型的解释,但我只是想知道代数数据类型在上下文中是什么意思这本书。谢谢你的阅读。
编辑:这不是关于名称"代数"的问题。这是关于ADT一词缺失定义的问题。换句话说,这本书没有清楚地解释ADT是否与数据相同。这是。但这本书令人困惑,并没有建立这种联系。这就是这个问题,而不是关于“代数”这个词。该名称也可能是“斑马数据类型”。问题是一样的。
答案 0 :(得分:6)
所谓的代数数据类型因为它们形成了类型的代数。这个代数由两个原始操作组成:
此处,乘积和求和运算与logical conjunction的logical disjunction(逻辑AND)和boolean algebra(逻辑OR)运算同构。
类型的产品是类型的逻辑结合。例如,考虑:
data Person = Person { name :: String
, age :: Int
, gender :: Char
}
此处数据构造函数Person
是String
,Int
和Char
类型的组合。这意味着它由String
和 Int
和 a Char
组成。因此,它是这些类型的产品:
data Person = Person (String * Int * Char)
这种数据类型称为product type。产品类型几乎适用于所有语言。例如,在C中,产品类型称为struct
。
类型之和是类型的逻辑分离。例如,考虑:
data Race = Dwarf | Elf | Hobbit | Human
此处数据类型Race
是数据构造函数Dwarf
,Elf
,Hobbit
和Human
的分离。这意味着它可能是Dwarf
或 Elf
或 a Hobbit
或 a Human
。因此,它是这些类型的总和:
data Race = Dwarf + Elf + Hobbit + Human
这种数据类型称为sum type。 Sum类型几乎适用于所有语言。例如,在C中,和类型称为union
。在Java中,它被称为enum
。
代数数据类型功能强大,因为它们允许您轻松创建产品和总和类型。例如,考虑:
data Shape = Circle { x :: Double
, y :: Double
, r :: Double
}
| Rectangle { x1 :: Double
, y1 :: Double
, x2 :: Double
, y2 :: Double
}
此处数据类型Shape
是数据构造函数Circle
和Rectangle
的总和,而Double ^ 3
和Double ^ 4
又是{{1}}和{{1}}类型的产品
在Haskell和其他函数式编程语言中创建这样的“代数”数据类型是简洁的。但是,在C和Java等语言中创建这样的数据类型是笨拙和冗长的。