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