Search code examples
haskellalgebraic-data-types

Single Constructor Algebraic Data Type: what does it mean?


If I make an algebraic data type like this:

data Foo = String

what is it? It appears to not be a sum type (there's nothing next to it to choose from), but also not a product type (there's no argument to combine it with). Is there some default implied here, like "an ADT with a single constructor is a Sum type"?


Solution

  • Your type Foo is equivalent to the unit type (); it's a type with a single value written String, just like () is a type with a single value written ().

    Any ADT is a sum-of-products. So:

    data Foo
        = One Integer String
        | Two String Integer
    

    declares Foo to be (warning: not actually Haskell!) Integer * String + String * Integer.

    If you have a product of 0 types, that's just the empty product () (just like product [] is 1), so

    data Bar
        = Three
        | Four String Integer
    

    declares Bar to be () + String * Integer.

    And, of course, if you have a sum of 1 type, it's just that type (just like sum [x] is x:

    data Baz = Five
    

    declares Baz to be ().

    So it is a sum type, but trivially, since it's a sum of only one type; and it's a product type, but again trivially, since it's a product of 0 types.