compound-types-0.1.4: Sum and Product types and such

Safe Haskell None Haskell2010

CompoundTypes.Strict

Description

Implementations of the strict data-structures.

Synopsis

# Sum-types

data Sum2 _1 _2 Source #

Constructors

 Sum2_1 !_1 Sum2_2 !_2

data Sum3 _1 _2 _3 Source #

Constructors

 Sum3_1 !_1 Sum3_2 !_2 Sum3_3 !_3

data Sum4 _1 _2 _3 _4 Source #

Constructors

 Sum4_1 !_1 Sum4_2 !_2 Sum4_3 !_3 Sum4_4 !_4

data Sum5 _1 _2 _3 _4 _5 Source #

Constructors

 Sum5_1 !_1 Sum5_2 !_2 Sum5_3 !_3 Sum5_4 !_4 Sum5_5 !_5

data Sum6 _1 _2 _3 _4 _5 _6 Source #

Constructors

 Sum6_1 !_1 Sum6_2 !_2 Sum6_3 !_3 Sum6_4 !_4 Sum6_5 !_5 Sum6_6 !_6

data Sum7 _1 _2 _3 _4 _5 _6 _7 Source #

Constructors

 Sum7_1 !_1 Sum7_2 !_2 Sum7_3 !_3 Sum7_4 !_4 Sum7_5 !_5 Sum7_6 !_6 Sum7_7 !_7

type family a + b where ... infixl 0 Source #

Automatically derives the sum-type of the according arity from expressions such as:

Int + Char + Bool

In that case it will resolve to:

Sum3 Int Char Bool

Equations

 (Sum6 _1 _2 _3 _4 _5 _6) + _7 = Sum7 _1 _2 _3 _4 _5 _6 _7 (Sum5 _1 _2 _3 _4 _5) + (Sum2 _6 _7) = Sum7 _1 _2 _3 _4 _5 _6 _7 (Sum5 _1 _2 _3 _4 _5) + _6 = Sum6 _1 _2 _3 _4 _5 _6 (Sum4 _1 _2 _3 _4) + (Sum3 _5 _6 _7) = Sum7 _1 _2 _3 _4 _5 _6 _7 (Sum4 _1 _2 _3 _4) + (Sum2 _5 _6) = Sum6 _1 _2 _3 _4 _5 _6 (Sum4 _1 _2 _3 _4) + _5 = Sum5 _1 _2 _3 _4 _5 (Sum3 _1 _2 _3) + (Sum4 _4 _5 _6 _7) = Sum7 _1 _2 _3 _4 _5 _6 _7 (Sum3 _1 _2 _3) + (Sum3 _4 _5 _6) = Sum6 _1 _2 _3 _4 _5 _6 (Sum3 _1 _2 _3) + (Sum2 _4 _5) = Sum5 _1 _2 _3 _4 _5 (Sum3 _1 _2 _3) + _4 = Sum4 _1 _2 _3 _4 (Sum2 _1 _2) + (Sum5 _3 _4 _5 _6 _7) = Sum7 _1 _2 _3 _4 _5 _6 _7 (Sum2 _1 _2) + (Sum4 _3 _4 _5 _6) = Sum6 _1 _2 _3 _4 _5 _6 (Sum2 _1 _2) + (Sum3 _3 _4 _5) = Sum5 _1 _2 _3 _4 _5 (Sum2 _1 _2) + (Sum2 _3 _4) = Sum4 _1 _2 _3 _4 (Sum2 _1 _2) + _3 = Sum3 _1 _2 _3 (Unsubtracted _1 _2) + _2 = _1 (Unsubtracted _1 _2) + _3 = Unsubtracted (_1 + _3) _2 _1 + (Sum6 _2 _3 _4 _5 _6 _7) = Sum7 _1 _2 _3 _4 _5 _6 _7 _1 + (Sum5 _2 _3 _4 _5 _6) = Sum6 _1 _2 _3 _4 _5 _6 _1 + (Sum4 _2 _3 _4 _5) = Sum5 _1 _2 _3 _4 _5 _1 + (Sum3 _2 _3 _4) = Sum4 _1 _2 _3 _4 _1 + (Sum2 _2 _3) = Sum3 _1 _2 _3 _1 + (Unsubtracted _2 _1) = _2 _1 + (Unsubtracted _2 _3) = Unsubtracted (_1 + _2) _3 _1 + _2 = Sum2 _1 _2

# Subtraction

type family a - b where ... infixl 0 Source #

An operator for removing elements from the sum-types. E.g.,

Int + Char + Bool - Char

is the same type as

Int + Bool

Equations

 (Sum7 _1 _2 _3 _4 _5 _6 _7) - _1 = Sum6 _2 _3 _4 _5 _6 _7 (Sum7 _1 _2 _3 _4 _5 _6 _7) - _2 = Sum6 _1 _3 _4 _5 _6 _7 (Sum7 _1 _2 _3 _4 _5 _6 _7) - _3 = Sum6 _1 _2 _4 _5 _6 _7 (Sum7 _1 _2 _3 _4 _5 _6 _7) - _4 = Sum6 _1 _2 _3 _5 _6 _7 (Sum7 _1 _2 _3 _4 _5 _6 _7) - _5 = Sum6 _1 _2 _3 _4 _6 _7 (Sum7 _1 _2 _3 _4 _5 _6 _7) - _6 = Sum6 _1 _2 _3 _4 _5 _7 (Sum7 _1 _2 _3 _4 _5 _6 _7) - _7 = Sum6 _1 _2 _3 _4 _5 _6 (Sum6 _1 _2 _3 _4 _5 _6) - _1 = Sum5 _2 _3 _4 _5 _6 (Sum6 _1 _2 _3 _4 _5 _6) - _2 = Sum5 _1 _3 _4 _5 _6 (Sum6 _1 _2 _3 _4 _5 _6) - _3 = Sum5 _1 _2 _4 _5 _6 (Sum6 _1 _2 _3 _4 _5 _6) - _4 = Sum5 _1 _2 _3 _5 _6 (Sum6 _1 _2 _3 _4 _5 _6) - _5 = Sum5 _1 _2 _3 _4 _6 (Sum6 _1 _2 _3 _4 _5 _6) - _6 = Sum5 _1 _2 _3 _4 _5 (Sum5 _1 _2 _3 _4 _5) - _1 = Sum4 _2 _3 _4 _5 (Sum5 _1 _2 _3 _4 _5) - _2 = Sum4 _1 _3 _4 _5 (Sum5 _1 _2 _3 _4 _5) - _3 = Sum4 _1 _2 _4 _5 (Sum5 _1 _2 _3 _4 _5) - _4 = Sum4 _1 _2 _3 _5 (Sum5 _1 _2 _3 _4 _5) - _5 = Sum4 _1 _2 _3 _4 (Sum4 _1 _2 _3 _4) - _1 = Sum3 _2 _3 _4 (Sum4 _1 _2 _3 _4) - _2 = Sum3 _1 _3 _4 (Sum4 _1 _2 _3 _4) - _3 = Sum3 _1 _2 _4 (Sum4 _1 _2 _3 _4) - _4 = Sum3 _1 _2 _3 (Sum3 _1 _2 _3) - _1 = Sum2 _2 _3 (Sum3 _1 _2 _3) - _2 = Sum2 _1 _3 (Sum3 _1 _2 _3) - _3 = Sum2 _1 _2 (Sum2 _1 _2) - _1 = _2 (Sum2 _1 _2) - _2 = _1 (Unsubtracted _1 _2) - _3 = Unsubtracted (_1 - _3) _2 _1 - (Sum7 _2 _3 _4 _5 _6 _7 _8) = ((((((_1 - _2) - _3) - _4) - _5) - _6) - _7) - _8 _1 - (Sum6 _2 _3 _4 _5 _6 _7) = (((((_1 - _2) - _3) - _4) - _5) - _6) - _7 _1 - (Sum5 _2 _3 _4 _5 _6) = ((((_1 - _2) - _3) - _4) - _5) - _6 _1 - (Sum4 _2 _3 _4 _5) = (((_1 - _2) - _3) - _4) - _5 _1 - (Sum3 _2 _3 _4) = ((_1 - _2) - _3) - _4 _1 - (Sum2 _2 _3) = (_1 - _2) - _3 _1 - _2 = Unsubtracted _1 _2

data Unsubtracted minuend subtrahend Source #

What you get, when the subtraction cannot yet be performed.

Happens when the minuend doesn't contain the subtrahend. E.g.,

Char - Bool

produces

Unsubtracted Char Bool

However it's possible to get back to the normal type, when you perform the required addition afterwards. E.g.,

Char - Bool + Bool

produces

Char

This construct actually exists primarily for that purpose.

# Product-types

data Product2 _1 _2 Source #

Constructors

 Product2 !_1 !_2

data Product3 _1 _2 _3 Source #

Constructors

 Product3 !_1 !_2 !_3

data Product4 _1 _2 _3 _4 Source #

Constructors

 Product4 !_1 !_2 !_3 !_4

data Product5 _1 _2 _3 _4 _5 Source #

Constructors

 Product5 !_1 !_2 !_3 !_4 !_5

data Product6 _1 _2 _3 _4 _5 _6 Source #

Constructors

 Product6 !_1 !_2 !_3 !_4 !_5 !_6

data Product7 _1 _2 _3 _4 _5 _6 _7 Source #

Constructors

 Product7 !_1 !_2 !_3 !_4 !_5 !_6 !_7

type family a * b where ... infixl 1 Source #

Automatically derives the product-type of the according arity from expressions such as:

Int * Char * Bool

In that case it will resolve to:

Product3 Int Char Bool

Equations

 (Product6 _1 _2 _3 _4 _5 _6) * _7 = Product7 _1 _2 _3 _4 _5 _6 _7 (Product5 _1 _2 _3 _4 _5) * (Product2 _6 _7) = Product7 _1 _2 _3 _4 _5 _6 _7 (Product5 _1 _2 _3 _4 _5) * _6 = Product6 _1 _2 _3 _4 _5 _6 (Product4 _1 _2 _3 _4) * (Product3 _5 _6 _7) = Product7 _1 _2 _3 _4 _5 _6 _7 (Product4 _1 _2 _3 _4) * (Product2 _5 _6) = Product6 _1 _2 _3 _4 _5 _6 (Product4 _1 _2 _3 _4) * _5 = Product5 _1 _2 _3 _4 _5 (Product3 _1 _2 _3) * (Product4 _4 _5 _6 _7) = Product7 _1 _2 _3 _4 _5 _6 _7 (Product3 _1 _2 _3) * (Product3 _4 _5 _6) = Product6 _1 _2 _3 _4 _5 _6 (Product3 _1 _2 _3) * (Product2 _4 _5) = Product5 _1 _2 _3 _4 _5 (Product3 _1 _2 _3) * _4 = Product4 _1 _2 _3 _4 (Product2 _1 _2) * (Product5 _3 _4 _5 _6 _7) = Product7 _1 _2 _3 _4 _5 _6 _7 (Product2 _1 _2) * (Product4 _3 _4 _5 _6) = Product6 _1 _2 _3 _4 _5 _6 (Product2 _1 _2) * (Product3 _3 _4 _5) = Product5 _1 _2 _3 _4 _5 (Product2 _1 _2) * (Product2 _3 _4) = Product4 _1 _2 _3 _4 (Product2 _1 _2) * _3 = Product3 _1 _2 _3 (Undivided _1 _2) * _2 = _1 (Undivided _1 _2) * _3 = Undivided (_1 * _3) _2 _1 * (Product6 _2 _3 _4 _5 _6 _7) = Product7 _1 _2 _3 _4 _5 _6 _7 _1 * (Product5 _2 _3 _4 _5 _6) = Product6 _1 _2 _3 _4 _5 _6 _1 * (Product4 _2 _3 _4 _5) = Product5 _1 _2 _3 _4 _5 _1 * (Product3 _2 _3 _4) = Product4 _1 _2 _3 _4 _1 * (Product2 _2 _3) = Product3 _1 _2 _3 _1 * (Undivided _2 _1) = _2 _1 * (Undivided _2 _3) = Undivided (_1 * _2) _3 _1 * _2 = Product2 _1 _2

# Division

type family a / b where ... infixl 1 Source #

An operator for removing elements from the product-types. E.g.,

Int * Char * Bool / Char

is the same type as

Int * Bool

Equations

 (Product7 _1 _2 _3 _4 _5 _6 _7) / _1 = Product6 _2 _3 _4 _5 _6 _7 (Product7 _1 _2 _3 _4 _5 _6 _7) / _2 = Product6 _1 _3 _4 _5 _6 _7 (Product7 _1 _2 _3 _4 _5 _6 _7) / _3 = Product6 _1 _2 _4 _5 _6 _7 (Product7 _1 _2 _3 _4 _5 _6 _7) / _4 = Product6 _1 _2 _3 _5 _6 _7 (Product7 _1 _2 _3 _4 _5 _6 _7) / _5 = Product6 _1 _2 _3 _4 _6 _7 (Product7 _1 _2 _3 _4 _5 _6 _7) / _6 = Product6 _1 _2 _3 _4 _5 _7 (Product7 _1 _2 _3 _4 _5 _6 _7) / _7 = Product6 _1 _2 _3 _4 _5 _6 (Product6 _1 _2 _3 _4 _5 _6) / _1 = Product5 _2 _3 _4 _5 _6 (Product6 _1 _2 _3 _4 _5 _6) / _2 = Product5 _1 _3 _4 _5 _6 (Product6 _1 _2 _3 _4 _5 _6) / _3 = Product5 _1 _2 _4 _5 _6 (Product6 _1 _2 _3 _4 _5 _6) / _4 = Product5 _1 _2 _3 _5 _6 (Product6 _1 _2 _3 _4 _5 _6) / _5 = Product5 _1 _2 _3 _4 _6 (Product6 _1 _2 _3 _4 _5 _6) / _6 = Product5 _1 _2 _3 _4 _5 (Product5 _1 _2 _3 _4 _5) / _1 = Product4 _2 _3 _4 _5 (Product5 _1 _2 _3 _4 _5) / _2 = Product4 _1 _3 _4 _5 (Product5 _1 _2 _3 _4 _5) / _3 = Product4 _1 _2 _4 _5 (Product5 _1 _2 _3 _4 _5) / _4 = Product4 _1 _2 _3 _5 (Product5 _1 _2 _3 _4 _5) / _5 = Product4 _1 _2 _3 _4 (Product4 _1 _2 _3 _4) / _1 = Product3 _2 _3 _4 (Product4 _1 _2 _3 _4) / _2 = Product3 _1 _3 _4 (Product4 _1 _2 _3 _4) / _3 = Product3 _1 _2 _4 (Product4 _1 _2 _3 _4) / _4 = Product3 _1 _2 _3 (Product3 _1 _2 _3) / _1 = Product2 _2 _3 (Product3 _1 _2 _3) / _2 = Product2 _1 _3 (Product3 _1 _2 _3) / _3 = Product2 _1 _2 (Product2 _1 _2) / _1 = _2 (Product2 _1 _2) / _2 = _1 (Undivided _1 _2) / _3 = Undivided (_1 / _3) _2 _1 / (Product7 _2 _3 _4 _5 _6 _7 _8) = ((((((_1 / _2) / _3) / _4) / _5) / _6) / _7) / _8 _1 / (Product6 _2 _3 _4 _5 _6 _7) = (((((_1 / _2) / _3) / _4) / _5) / _6) / _7 _1 / (Product5 _2 _3 _4 _5 _6) = ((((_1 / _2) / _3) / _4) / _5) / _6 _1 / (Product4 _2 _3 _4 _5) = (((_1 / _2) / _3) / _4) / _5 _1 / (Product3 _2 _3 _4) = ((_1 / _2) / _3) / _4 _1 / (Product2 _2 _3) = (_1 / _2) / _3 _1 / _2 = Undivided _1 _2

data Undivided dividend divisor Source #

What you get, when the division cannot yet be performed.

Happens when the dividend doesn't contain the divisor. E.g.,

Char / Bool

produces

Undivided Char Bool

However it's possible to get back to the normal type, when you perform the required multiplication afterwards. E.g.,

Char / Bool * Bool

produces

Char

This construct actually exists primarily for that purpose.