我理解G.A.D.T&是什么,但G.A.D.T&基础类型(在Haskell或其他地方)有什么区别?
答案 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
将列表的大小增加一个。