为什么“代数数据类型”在名称中使用“代数”?

时间:2014-07-31 14:21:26

标签: functional-programming algebraic-data-types

当我学习Scala / Haskell时,我发现有Algebraic data type的概念。我已经阅读了维基百科的解释,但我还有一个问题:

为什么使用" Algebraic"在它的名字?它与" Algebraic"?

有什么关系

3 个答案:

答案 0 :(得分:3)

简单来说,我们必须考虑代数和类型之间的关系。 Haskell的代数数据类型被命名为,因为它们对应于类别理论中的初始代数。

维基百科说:

  

在计算机编程中,特别是函数式编程和类型   理论上,代数数据类型是一种复合类型,即a   通过组合其他类型形成的类型。

我们采用Maybe a数据类型:

data Maybe a = Nothing | Just a

Maybe a表示它可能包含a - Just Int类型的内容,但也可以为空 - Nothing。在haskell类型中是对象,例如Int。运算符获取类型并生成新类型,例如Maybe IntAlgebraic是指algebraic操作创建代数数据类型的属性:sumsproduct其中:

  • “sum”是交替(A | B,意思是A或B但不是两者)
  • “产品”是组合(A B,意思是A和B在一起)

例如,让我们看sum Maybe a。首先,让我们定义Add类型:

data Add a b = Left a | Right b

在haskell中|or,因此可以是Left aRight 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相同。

如果你想深入 - The Algebra of Data, and the Calculus of Mutation

答案 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 ContextsThe Wikipedia entry on zippers

答案 2 :(得分:0)

相关问题:https://math.stackexchange.com/questions/50375/whats-the-meaning-of-algebraic-data-type

我的回答(那里):这都是关于代数理论的。