|
|
|
|
|
by jolmg
2405 days ago
|
|
> Is it just that it can be true or false, and because there's the "or", it's a sum type? You can rote learn that, but the reason why it's intuitive to call them sum types is because you're adding the number of possible values. With product types, you multiply the number of possible values that the type represents. Consider these types: -- 1 + 1 = 2 possible values
data Bool = True | False
-- 1 + 1 * a = 1 + a possible values
data Maybe a = Nothing | Just a
-- 1 * a + 1 * b = a + b possible values
data Either a b = Left a | Right b
-- 1 * a * b possible values
data Pair a b = Pair a b
-- 1 * a * b * c possible values
data Triple a b c = Triple a b c
`Maybe Bool` would have 1 + 2 = 3 possible values.`Either (Pair Bool Bool) (Maybe Bool)` would have (2 * 2) + (1 + 2) = 7 possible values. Integers would be defined as: data Int = ... | -2 | -1 | 0 | 1 | 2 | ...
if they were finite, but since they're not, they'd have to be defined recursively with something like: data PositiveInteger = One | Succ PositiveInteger
data Integer = Zero | NonZero Bool PositiveInteger
where the Bool represents the sign.Since 2 * x is the same as x + x, we can also define it as: data Integer = Zero | NonZero (Either PositiveInteger PositiveInteger)
where Left of Either would represent negative integers, and Right of Either would represent positive integers. |
|