我正在阅读Learn You a Haskell,似乎作者没有明确定义"代数数据类型"这个术语的含义.该术语首次出现在本书PDF版本的第126页,并且在首次出现之前没有明确的定义.
有人可以按照本书的精神填写这个缺失的定义吗?
换句话说,有人会根据本书前126页中包含的信息给出一个可以理解的简单定义吗?
我怀疑代数数据类型是由关键字"数据"定义的任何内容,但我并非100%确定.
我知道网上有很多关于代数数据类型的解释,但我想知道代数数据类型在本书的上下文中意味着什么.谢谢阅读.
编辑:这不是关于"代数"这个名字的问题.这是关于ADT一词缺失定义的问题.换句话说,本书没有清楚地解释ADT是否与"数据"相同.这是.但这本书令人困惑,并没有建立这种联系.这就是这个问题,而不是"代数"这个词.这个名字也可能是"斑马数据类型",问题也是一样的.
代数数据类型之所以被称为是因为它们形成了类型的代数.这个代数包含两个原始操作:
这里的乘积和求和运算与布尔代数的逻辑联合(逻辑AND)和逻辑分离(逻辑OR)运算是同构的.
类型的产品是类型的逻辑结合.例如考虑:
data Person = Person { name :: String
, age :: Int
, gender :: Char
}
Run Code Online (Sandbox Code Playgroud)
这里的数据构造函数Person是类型的结合String,Int和Char.这意味着,它是由一个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,Hobbit和Human.这意味着它可以是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是数据构造的总和Circle和Rectangle这反过来的产品类型Double ^ 3和Double ^ 4分别.
在Haskell和其他函数式编程语言中创建这样的"代数"数据类型是简洁的.但是,在C和Java等语言中创建这样的数据类型是笨拙和冗长的.