当我学习Scala / Haskell时,我发现有Algebraic data type的概念。我已经阅读了维基百科的解释,但我还有一个问题:
为什么使用" Algebraic"在它的名字?它与" Algebraic"?
有什么关系答案 0 :(得分:3)
简单来说,我们必须考虑代数和类型之间的关系。 Haskell的代数数据类型被命名为,因为它们对应于类别理论中的初始代数。
维基百科说:
在计算机编程中,特别是函数式编程和类型 理论上,代数数据类型是一种复合类型,即a 通过组合其他类型形成的类型。
我们采用Maybe a
数据类型:
data Maybe a = Nothing | Just a
Maybe a
表示它可能包含a
- Just Int
类型的内容,但也可以为空 - Nothing
。在haskell类型中是对象,例如Int
。运算符获取类型并生成新类型,例如Maybe Int
。 Algebraic
是指algebraic
操作创建代数数据类型的属性:sums
和product
其中:
例如,让我们看sum
Maybe a
。首先,让我们定义Add
类型:
data Add a b = Left a | Right b
在haskell中|
为or
,因此可以是Left a
或Right b
。纵向栏|
向我们显示我们上面定义的Maybe
是和类型,这意味着我们可以使用Add
来编写它:
type Maybe a = Add Nothing (Just a)
Nothing
此处是unit
类型:
在数学逻辑和计算机科学领域称为类型 理论上,单位类型是允许只有一个值的类型
data Unit = Unit
或者()
在haskell中。
Just a
是单身类型。单例类型是那些只有一个值的类型。
data Just a = Just a
之后,我们可以将其重写为:
type Maybe a = Add () a
所以我们有单位类型 - 1
和单例类型 - a
。现在我们可以说Maybe a
与1 + a相同。
答案 1 :(得分:3)
考虑类型Bool
。当然,这种类型可以采用两个可能的值之一:True或False。
现在考虑
data EitherBool = Left Bool | Right Bool
此类型可以使用多少个值?有4个:Left False, Left True, Right False, Right True
。 <怎么样
data EitherBoolInt = Left Bool | Right Int8
这里左分支有2个可能的值,右分支有2 ^ 8个。对于EitherBoolInt
,总共有2 + 2 ^ 8个可能的值。应该很容易看出,对于任何一组构造函数和类型,这种构造将为您提供一个数据类型,其中可能值的空间大小为每个构造函数的可能值的 sum 的大小。出于这个原因,它被称为和类型。
改为考虑
data BoolAndInt = BAndI Bool Int8
或只是
type BoolAndInt = (Bool, Int)
这可以承担多少个值?对于每个可能的Int8,有两个BoolAndInts,总共2 * 2 ^ 8 = 2 ^ 9个总值。可能值的总数是构造函数的每个字段的值数量的 product ,因此称为 product 类型。
这个想法可以进一步扩展 - 例如,a-> b的函数是指数数据类型(参见The Algebra of Algebraic Datatypes)。您甚至可以创建数据类型的衍生的合理概念。这甚至不是一个纯粹的理论思想 - 它是&#34;拉链&#34;的功能构造的基础。请参阅The Derivative of a Datatype is the Type of its One-Hole Contexts和The Wikipedia entry on zippers。
答案 2 :(得分:0)
相关问题:https://math.stackexchange.com/questions/50375/whats-the-meaning-of-algebraic-data-type
我的回答(那里):这都是关于代数理论的。