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

时间:2014-03-01 12:17:47

标签: haskell types

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

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

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

我怀疑代数数据类型是由关键字'数据'定义的任何内容。但我并非百分之百确定。

据我所知,网上有很多关于代数数据类型的解释,但我只是想知道代数数据类型在上下文中是什么意思这本书。谢谢你的阅读。

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

1 个答案:

答案 0 :(得分:6)

所谓的代数数据类型因为它们形成了类型的代数。这个代数由两个原始操作组成:

  1. 产品
  2. 萨姆
  3. 此处,乘积和求和运算与logical conjunctionlogical disjunction(逻辑AND)和boolean algebra(逻辑OR)运算同构。


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

    data Person = Person { name   :: String
                         , age    :: Int
                         , gender :: Char
                         }
    

    此处数据构造函数PersonStringIntChar类型的组合。这意味着它由String Int a Char组成。因此,它是这些类型的产品:

    data Person = Person (String * Int * Char)
    

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


    类型之和是类型的逻辑分离。例如,考虑:

    data Race = Dwarf | Elf | Hobbit | Human
    

    此处数据类型Race是数据构造函数DwarfElfHobbitHuman的分离。这意味着它可能是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是数据构造函数CircleRectangle的总和,而Double ^ 3Double ^ 4又是{{1}}和{{1}}类型的产品

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