单构造函数代数数据类型:这是什么意思?

时间:2014-09-05 01:33:39

标签: haskell algebraic-data-types

如果我创建这样的代数数据类型:

data Foo = String
这是什么?它似乎不是一种总和类型(它旁边没有任何东西可供选择),但也不是一种产品类型(没有任何论据可以将它与之结合起来)。这里是否有一些默认值,例如"带有单个构造函数的ADT是Sum类型"?

1 个答案:

答案 0 :(得分:8)

您的类型Foo相当于单位类型();它是一个写有String单个值的类型,就像()是一个写有()的单个值的类型。

任何ADT都是产品总和。所以:

data Foo
    = One Integer String
    | Two String Integer

声明Foo是(警告:实际上不是Haskell!)Integer * String + String * Integer

如果你有0种类型的产品,那只是空产品()(就像product []一样),所以

data Bar
    = Three
    | Four String Integer

Bar声明为() + String * Integer

当然,如果你有1种类型的总和,那就是那种类型(就像sum [x]x一样:

data Baz = Five

Baz声明为()

所以这是一种和型,但是很简单,因为它只是一种类型的总和;它是一种产品类型,但同样也很简单,因为它是0种类型的产品。