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

hoo*_*rEE 2 haskell algebraic-data-types

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

data Foo = String
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ast 8

您的类型Foo等同于单位类型(); 它是一个写入单个值的类型String,就像写入单个值()的类型一样().

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

data Foo
    = One Integer String
    | Two String Integer
Run Code Online (Sandbox Code Playgroud)

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

如果您有0种类型的产品,那就是空产品()(就像product []是1),所以

data Bar
    = Three
    | Four String Integer
Run Code Online (Sandbox Code Playgroud)

宣称Bar() + String * Integer.

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

data Baz = Five
Run Code Online (Sandbox Code Playgroud)

宣称Baz().

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

  • 它类似于`foldl(+)1`(sum)和`fol​​dl(*)1`(产品)在它们作用于空列表时产生相同值的方式. (5认同)