代数数据类型和基类型之间的区别是什么?

时间:2016-06-01 14:10:39

标签: haskell computer-science

我理解G.A.D.T&是什么,但G.A.D.T&基础类型(在Haskell或其他地方)有什么区别?

1 个答案:

答案 0 :(得分:5)

我不确定您是指常规data声明与Int类型或使用GADTs扩展的广义代数数据类型,因此如果这不能回答您的问题,请澄清。

普通data声明允许您创建属于产品(this和that)和sums(this或that)组合的类型。

一些例子是:

data Color = Red | Green | Blue                      -- a sum type
data Person = Person { name :: String, age :: Int }  -- a product type
data Address = Mail Street City Country | Email String -- both!

GADT允许您更具体地了解每个构造函数的类型。这是我最喜欢的例子:

-- helper types to encode natural numbers
data Z     -- zero
data S n   -- successor

-- a list that encodes its size in its type
data List a n where
  Nil :: List a Z
  Cons :: a -> List a n -> List a (S n)

-- head that cannot be called on an empty list!
head :: List a (S n) -> a
head (Cons h _) = h

-- tail that cannot be called on a empty list!
tail :: List a (S n) -> List a n
tail (Cons _ t) = t

请注意,我们无法使用

等常规数据声明来完成此操作
data List a n = Nil | Cons a (List a n)

因为无法指定Nil的类型为List a Z,而Cons将列表的大小增加一个。