diff --git a/compound-types.cabal b/compound-types.cabal
--- a/compound-types.cabal
+++ b/compound-types.cabal
@@ -1,7 +1,7 @@
 name:
   compound-types
 version:
-  0.1.2.1
+  0.1.3
 category:
   Data, Types, Type System
 synopsis:
diff --git a/library/CompoundTypes/Private/Lazy/Product.hs b/library/CompoundTypes/Private/Lazy/Product.hs
--- a/library/CompoundTypes/Private/Lazy/Product.hs
+++ b/library/CompoundTypes/Private/Lazy/Product.hs
@@ -1,23 +1,24 @@
+{-# LANGUAGE UndecidableInstances #-}
 module CompoundTypes.Private.Lazy.Product where
 
 
-data Product2 v1 v2 =
-  Product2 v1 v2
+data Product2 _1 _2 =
+  Product2 _1 _2
 
-data Product3 v1 v2 v3 =
-  Product3 v1 v2 v3
+data Product3 _1 _2 _3 =
+  Product3 _1 _2 _3
 
-data Product4 v1 v2 v3 v4 =
-  Product4 v1 v2 v3 v4
+data Product4 _1 _2 _3 _4 =
+  Product4 _1 _2 _3 _4
 
-data Product5 v1 v2 v3 v4 v5 =
-  Product5 v1 v2 v3 v4 v5
+data Product5 _1 _2 _3 _4 _5 =
+  Product5 _1 _2 _3 _4 _5
 
-data Product6 v1 v2 v3 v4 v5 v6 =
-  Product6 v1 v2 v3 v4 v5 v6
+data Product6 _1 _2 _3 _4 _5 _6 =
+  Product6 _1 _2 _3 _4 _5 _6
 
-data Product7 v1 v2 v3 v4 v5 v6 v7 =
-  Product7 v1 v2 v3 v4 v5 v6 v7
+data Product7 _1 _2 _3 _4 _5 _6 _7 =
+  Product7 _1 _2 _3 _4 _5 _6 _7
 
 
 -- |
@@ -29,48 +30,185 @@
 -- In that case it will resolve to:
 -- 
 -- > Product3 Int Char Bool
-type family (*) a b where
-  Product6 v1 v2 v3 v4 v5 v6 * v7 =
-    Product7 v1 v2 v3 v4 v5 v6 v7
-  Product5 v1 v2 v3 v4 v5 * Product2 v6 v7 =
-    Product7 v1 v2 v3 v4 v5 v6 v7
-  Product5 v1 v2 v3 v4 v5 * v6 =
-    Product6 v1 v2 v3 v4 v5 v6
-  Product4 v1 v2 v3 v4 * Product3 v5 v6 v7 =
-    Product7 v1 v2 v3 v4 v5 v6 v7
-  Product4 v1 v2 v3 v4 * Product2 v5 v6 =
-    Product6 v1 v2 v3 v4 v5 v6
-  Product4 v1 v2 v3 v4 * v5 =
-    Product5 v1 v2 v3 v4 v5
-  Product3 v1 v2 v3 * Product4 v4 v5 v6 v7 =
-    Product7 v1 v2 v3 v4 v5 v6 v7
-  Product3 v1 v2 v3 * Product3 v4 v5 v6 =
-    Product6 v1 v2 v3 v4 v5 v6
-  Product3 v1 v2 v3 * Product2 v4 v5 =
-    Product5 v1 v2 v3 v4 v5
-  Product3 v1 v2 v3 * v4 =
-    Product4 v1 v2 v3 v4
-  Product2 v1 v2 * Product5 v3 v4 v5 v6 v7 =
-    Product7 v1 v2 v3 v4 v5 v6 v7
-  Product2 v1 v2 * Product4 v3 v4 v5 v6 =
-    Product6 v1 v2 v3 v4 v5 v6
-  Product2 v1 v2 * Product3 v3 v4 v5 =
-    Product5 v1 v2 v3 v4 v5
-  Product2 v1 v2 * Product2 v3 v4 =
-    Product4 v1 v2 v3 v4
-  Product2 v1 v2 * v3 =
-    Product3 v1 v2 v3
-  v1 * Product6 v2 v3 v4 v5 v6 v7 =
-    Product7 v1 v2 v3 v4 v5 v6 v7
-  v1 * Product5 v2 v3 v4 v5 v6 =
-    Product6 v1 v2 v3 v4 v5 v6
-  v1 * Product4 v2 v3 v4 v5 =
-    Product5 v1 v2 v3 v4 v5
-  v1 * Product3 v2 v3 v4 =
-    Product4 v1 v2 v3 v4
-  v1 * Product2 v2 v3 =
-    Product3 v1 v2 v3
-  v1 * v2 =
-    Product2 v1 v2
+type family a * b where
 
+  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
+
 infixl 1 *
+
+
+-- * Division
+-------------------------
+
+-- |
+-- An operator for removing elements from the product-types.
+-- E.g.,
+-- 
+-- > Int * Char * Bool / Char
+-- 
+-- is the same type as
+-- 
+-- > Int * Bool
+-- 
+type family a / b where
+
+  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
+
+  -- This group requires the UndecidableInstances extension
+  _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
+
+infixl 1 /
+
+
+-- |
+-- 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.
+data Undivided dividend divisor
diff --git a/library/CompoundTypes/Private/Lazy/Sum.hs b/library/CompoundTypes/Private/Lazy/Sum.hs
--- a/library/CompoundTypes/Private/Lazy/Sum.hs
+++ b/library/CompoundTypes/Private/Lazy/Sum.hs
@@ -1,23 +1,24 @@
+{-# LANGUAGE UndecidableInstances #-}
 module CompoundTypes.Private.Lazy.Sum where
 
 
-data Sum2 v1 v2 =
-  Sum2_1 v1 | Sum2_2 v2
+data Sum2 _1 _2 =
+  Sum2_1 _1 | Sum2_2 _2
 
-data Sum3 v1 v2 v3 =
-  Sum3_1 v1 | Sum3_2 v2 | Sum3_3 v3
+data Sum3 _1 _2 _3 =
+  Sum3_1 _1 | Sum3_2 _2 | Sum3_3 _3
 
-data Sum4 v1 v2 v3 v4 =
-  Sum4_1 v1 | Sum4_2 v2 | Sum4_3 v3 | Sum4_4 v4
+data Sum4 _1 _2 _3 _4 =
+  Sum4_1 _1 | Sum4_2 _2 | Sum4_3 _3 | Sum4_4 _4
 
-data Sum5 v1 v2 v3 v4 v5 =
-  Sum5_1 v1 | Sum5_2 v2 | Sum5_3 v3 | Sum5_4 v4 | Sum5_5 v5
+data Sum5 _1 _2 _3 _4 _5 =
+  Sum5_1 _1 | Sum5_2 _2 | Sum5_3 _3 | Sum5_4 _4 | Sum5_5 _5
 
-data Sum6 v1 v2 v3 v4 v5 v6 =
-  Sum6_1 v1 | Sum6_2 v2 | Sum6_3 v3 | Sum6_4 v4 | Sum6_5 v5 | Sum6_6 v6
+data Sum6 _1 _2 _3 _4 _5 _6 =
+  Sum6_1 _1 | Sum6_2 _2 | Sum6_3 _3 | Sum6_4 _4 | Sum6_5 _5 | Sum6_6 _6
 
-data Sum7 v1 v2 v3 v4 v5 v6 v7 =
-  Sum7_1 v1 | Sum7_2 v2 | Sum7_3 v3 | Sum7_4 v4 | Sum7_5 v5 | Sum7_6 v6 | Sum7_7 v7
+data Sum7 _1 _2 _3 _4 _5 _6 _7 =
+  Sum7_1 _1 | Sum7_2 _2 | Sum7_3 _3 | Sum7_4 _4 | Sum7_5 _5 | Sum7_6 _6 | Sum7_7 _7
 
 
 -- |
@@ -29,48 +30,185 @@
 -- In that case it will resolve to:
 -- 
 -- > Sum3 Int Char Bool
-type family (+) a b where
-  Sum6 v1 v2 v3 v4 v5 v6 + v7 =
-    Sum7 v1 v2 v3 v4 v5 v6 v7
-  Sum5 v1 v2 v3 v4 v5 + Sum2 v6 v7 =
-    Sum7 v1 v2 v3 v4 v5 v6 v7
-  Sum5 v1 v2 v3 v4 v5 + v6 =
-    Sum6 v1 v2 v3 v4 v5 v6
-  Sum4 v1 v2 v3 v4 + Sum3 v5 v6 v7 =
-    Sum7 v1 v2 v3 v4 v5 v6 v7
-  Sum4 v1 v2 v3 v4 + Sum2 v5 v6 =
-    Sum6 v1 v2 v3 v4 v5 v6
-  Sum4 v1 v2 v3 v4 + v5 =
-    Sum5 v1 v2 v3 v4 v5
-  Sum3 v1 v2 v3 + Sum4 v4 v5 v6 v7 =
-    Sum7 v1 v2 v3 v4 v5 v6 v7
-  Sum3 v1 v2 v3 + Sum3 v4 v5 v6 =
-    Sum6 v1 v2 v3 v4 v5 v6
-  Sum3 v1 v2 v3 + Sum2 v4 v5 =
-    Sum5 v1 v2 v3 v4 v5
-  Sum3 v1 v2 v3 + v4 =
-    Sum4 v1 v2 v3 v4
-  Sum2 v1 v2 + Sum5 v3 v4 v5 v6 v7 =
-    Sum7 v1 v2 v3 v4 v5 v6 v7
-  Sum2 v1 v2 + Sum4 v3 v4 v5 v6 =
-    Sum6 v1 v2 v3 v4 v5 v6
-  Sum2 v1 v2 + Sum3 v3 v4 v5 =
-    Sum5 v1 v2 v3 v4 v5
-  Sum2 v1 v2 + Sum2 v3 v4 =
-    Sum4 v1 v2 v3 v4
-  Sum2 v1 v2 + v3 =
-    Sum3 v1 v2 v3
-  v1 + Sum6 v2 v3 v4 v5 v6 v7 =
-    Sum7 v1 v2 v3 v4 v5 v6 v7
-  v1 + Sum5 v2 v3 v4 v5 v6 =
-    Sum6 v1 v2 v3 v4 v5 v6
-  v1 + Sum4 v2 v3 v4 v5 =
-    Sum5 v1 v2 v3 v4 v5
-  v1 + Sum3 v2 v3 v4 =
-    Sum4 v1 v2 v3 v4
-  v1 + Sum2 v2 v3 =
-    Sum3 v1 v2 v3
-  v1 + v2 =
-    Sum2 v1 v2
+type family a + b where
 
+  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
+
 infixl 0 +
+
+
+-- * Subtraction
+-------------------------
+
+-- |
+-- An operator for removing elements from the sum-types.
+-- E.g.,
+-- 
+-- > Int + Char + Bool - Char
+-- 
+-- is the same type as
+-- 
+-- > Int + Bool
+-- 
+type family a - b where
+
+  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
+
+  -- This group requires the UndecidableInstances extension
+  _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
+
+infixl 0 -
+
+
+-- |
+-- 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.
+data Unsubtracted minuend subtrahend
diff --git a/library/CompoundTypes/Private/Strict/Product.hs b/library/CompoundTypes/Private/Strict/Product.hs
--- a/library/CompoundTypes/Private/Strict/Product.hs
+++ b/library/CompoundTypes/Private/Strict/Product.hs
@@ -1,23 +1,24 @@
+{-# LANGUAGE UndecidableInstances #-}
 module CompoundTypes.Private.Strict.Product where
 
 
-data Product2 v1 v2 =
-  Product2 !v1 !v2
+data Product2 _1 _2 =
+  Product2 !_1 !_2
 
-data Product3 v1 v2 v3 =
-  Product3 !v1 !v2 !v3
+data Product3 _1 _2 _3 =
+  Product3 !_1 !_2 !_3
 
-data Product4 v1 v2 v3 v4 =
-  Product4 !v1 !v2 !v3 !v4
+data Product4 _1 _2 _3 _4 =
+  Product4 !_1 !_2 !_3 !_4
 
-data Product5 v1 v2 v3 v4 v5 =
-  Product5 !v1 !v2 !v3 !v4 !v5
+data Product5 _1 _2 _3 _4 _5 =
+  Product5 !_1 !_2 !_3 !_4 !_5
 
-data Product6 v1 v2 v3 v4 v5 v6 =
-  Product6 !v1 !v2 !v3 !v4 !v5 !v6
+data Product6 _1 _2 _3 _4 _5 _6 =
+  Product6 !_1 !_2 !_3 !_4 !_5 !_6
 
-data Product7 v1 v2 v3 v4 v5 v6 v7 =
-  Product7 !v1 !v2 !v3 !v4 !v5 !v6 !v7
+data Product7 _1 _2 _3 _4 _5 _6 _7 =
+  Product7 !_1 !_2 !_3 !_4 !_5 !_6 !_7
 
 
 -- |
@@ -29,48 +30,185 @@
 -- In that case it will resolve to:
 -- 
 -- > Product3 Int Char Bool
-type family (*) a b where
-  Product6 v1 v2 v3 v4 v5 v6 * v7 =
-    Product7 v1 v2 v3 v4 v5 v6 v7
-  Product5 v1 v2 v3 v4 v5 * Product2 v6 v7 =
-    Product7 v1 v2 v3 v4 v5 v6 v7
-  Product5 v1 v2 v3 v4 v5 * v6 =
-    Product6 v1 v2 v3 v4 v5 v6
-  Product4 v1 v2 v3 v4 * Product3 v5 v6 v7 =
-    Product7 v1 v2 v3 v4 v5 v6 v7
-  Product4 v1 v2 v3 v4 * Product2 v5 v6 =
-    Product6 v1 v2 v3 v4 v5 v6
-  Product4 v1 v2 v3 v4 * v5 =
-    Product5 v1 v2 v3 v4 v5
-  Product3 v1 v2 v3 * Product4 v4 v5 v6 v7 =
-    Product7 v1 v2 v3 v4 v5 v6 v7
-  Product3 v1 v2 v3 * Product3 v4 v5 v6 =
-    Product6 v1 v2 v3 v4 v5 v6
-  Product3 v1 v2 v3 * Product2 v4 v5 =
-    Product5 v1 v2 v3 v4 v5
-  Product3 v1 v2 v3 * v4 =
-    Product4 v1 v2 v3 v4
-  Product2 v1 v2 * Product5 v3 v4 v5 v6 v7 =
-    Product7 v1 v2 v3 v4 v5 v6 v7
-  Product2 v1 v2 * Product4 v3 v4 v5 v6 =
-    Product6 v1 v2 v3 v4 v5 v6
-  Product2 v1 v2 * Product3 v3 v4 v5 =
-    Product5 v1 v2 v3 v4 v5
-  Product2 v1 v2 * Product2 v3 v4 =
-    Product4 v1 v2 v3 v4
-  Product2 v1 v2 * v3 =
-    Product3 v1 v2 v3
-  v1 * Product6 v2 v3 v4 v5 v6 v7 =
-    Product7 v1 v2 v3 v4 v5 v6 v7
-  v1 * Product5 v2 v3 v4 v5 v6 =
-    Product6 v1 v2 v3 v4 v5 v6
-  v1 * Product4 v2 v3 v4 v5 =
-    Product5 v1 v2 v3 v4 v5
-  v1 * Product3 v2 v3 v4 =
-    Product4 v1 v2 v3 v4
-  v1 * Product2 v2 v3 =
-    Product3 v1 v2 v3
-  v1 * v2 =
-    Product2 v1 v2
+type family a * b where
 
+  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
+
 infixl 1 *
+
+
+-- * Division
+-------------------------
+
+-- |
+-- An operator for removing elements from the product-types.
+-- E.g.,
+-- 
+-- > Int * Char * Bool / Char
+-- 
+-- is the same type as
+-- 
+-- > Int * Bool
+-- 
+type family a / b where
+
+  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
+
+  -- This group requires the UndecidableInstances extension
+  _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
+
+infixl 1 /
+
+
+-- |
+-- 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.
+data Undivided dividend divisor
diff --git a/library/CompoundTypes/Private/Strict/Sum.hs b/library/CompoundTypes/Private/Strict/Sum.hs
--- a/library/CompoundTypes/Private/Strict/Sum.hs
+++ b/library/CompoundTypes/Private/Strict/Sum.hs
@@ -1,23 +1,24 @@
+{-# LANGUAGE UndecidableInstances #-}
 module CompoundTypes.Private.Strict.Sum where
 
 
-data Sum2 v1 v2 =
-  Sum2_1 !v1 | Sum2_2 !v2
+data Sum2 _1 _2 =
+  Sum2_1 !_1 | Sum2_2 !_2
 
-data Sum3 v1 v2 v3 =
-  Sum3_1 !v1 | Sum3_2 !v2 | Sum3_3 !v3
+data Sum3 _1 _2 _3 =
+  Sum3_1 !_1 | Sum3_2 !_2 | Sum3_3 !_3
 
-data Sum4 v1 v2 v3 v4 =
-  Sum4_1 !v1 | Sum4_2 !v2 | Sum4_3 !v3 | Sum4_4 !v4
+data Sum4 _1 _2 _3 _4 =
+  Sum4_1 !_1 | Sum4_2 !_2 | Sum4_3 !_3 | Sum4_4 !_4
 
-data Sum5 v1 v2 v3 v4 v5 =
-  Sum5_1 !v1 | Sum5_2 !v2 | Sum5_3 !v3 | Sum5_4 !v4 | Sum5_5 !v5
+data Sum5 _1 _2 _3 _4 _5 =
+  Sum5_1 !_1 | Sum5_2 !_2 | Sum5_3 !_3 | Sum5_4 !_4 | Sum5_5 !_5
 
-data Sum6 v1 v2 v3 v4 v5 v6 =
-  Sum6_1 !v1 | Sum6_2 !v2 | Sum6_3 !v3 | Sum6_4 !v4 | Sum6_5 !v5 | Sum6_6 !v6
+data Sum6 _1 _2 _3 _4 _5 _6 =
+  Sum6_1 !_1 | Sum6_2 !_2 | Sum6_3 !_3 | Sum6_4 !_4 | Sum6_5 !_5 | Sum6_6 !_6
 
-data Sum7 v1 v2 v3 v4 v5 v6 v7 =
-  Sum7_1 !v1 | Sum7_2 !v2 | Sum7_3 !v3 | Sum7_4 !v4 | Sum7_5 !v5 | Sum7_6 !v6 | Sum7_7 !v7
+data Sum7 _1 _2 _3 _4 _5 _6 _7 =
+  Sum7_1 !_1 | Sum7_2 !_2 | Sum7_3 !_3 | Sum7_4 !_4 | Sum7_5 !_5 | Sum7_6 !_6 | Sum7_7 !_7
 
 
 -- |
@@ -29,48 +30,185 @@
 -- In that case it will resolve to:
 -- 
 -- > Sum3 Int Char Bool
-type family (+) a b where
-  Sum6 v1 v2 v3 v4 v5 v6 + v7 =
-    Sum7 v1 v2 v3 v4 v5 v6 v7
-  Sum5 v1 v2 v3 v4 v5 + Sum2 v6 v7 =
-    Sum7 v1 v2 v3 v4 v5 v6 v7
-  Sum5 v1 v2 v3 v4 v5 + v6 =
-    Sum6 v1 v2 v3 v4 v5 v6
-  Sum4 v1 v2 v3 v4 + Sum3 v5 v6 v7 =
-    Sum7 v1 v2 v3 v4 v5 v6 v7
-  Sum4 v1 v2 v3 v4 + Sum2 v5 v6 =
-    Sum6 v1 v2 v3 v4 v5 v6
-  Sum4 v1 v2 v3 v4 + v5 =
-    Sum5 v1 v2 v3 v4 v5
-  Sum3 v1 v2 v3 + Sum4 v4 v5 v6 v7 =
-    Sum7 v1 v2 v3 v4 v5 v6 v7
-  Sum3 v1 v2 v3 + Sum3 v4 v5 v6 =
-    Sum6 v1 v2 v3 v4 v5 v6
-  Sum3 v1 v2 v3 + Sum2 v4 v5 =
-    Sum5 v1 v2 v3 v4 v5
-  Sum3 v1 v2 v3 + v4 =
-    Sum4 v1 v2 v3 v4
-  Sum2 v1 v2 + Sum5 v3 v4 v5 v6 v7 =
-    Sum7 v1 v2 v3 v4 v5 v6 v7
-  Sum2 v1 v2 + Sum4 v3 v4 v5 v6 =
-    Sum6 v1 v2 v3 v4 v5 v6
-  Sum2 v1 v2 + Sum3 v3 v4 v5 =
-    Sum5 v1 v2 v3 v4 v5
-  Sum2 v1 v2 + Sum2 v3 v4 =
-    Sum4 v1 v2 v3 v4
-  Sum2 v1 v2 + v3 =
-    Sum3 v1 v2 v3
-  v1 + Sum6 v2 v3 v4 v5 v6 v7 =
-    Sum7 v1 v2 v3 v4 v5 v6 v7
-  v1 + Sum5 v2 v3 v4 v5 v6 =
-    Sum6 v1 v2 v3 v4 v5 v6
-  v1 + Sum4 v2 v3 v4 v5 =
-    Sum5 v1 v2 v3 v4 v5
-  v1 + Sum3 v2 v3 v4 =
-    Sum4 v1 v2 v3 v4
-  v1 + Sum2 v2 v3 =
-    Sum3 v1 v2 v3
-  v1 + v2 =
-    Sum2 v1 v2
+type family a + b where
 
+  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
+
 infixl 0 +
+
+
+-- * Subtraction
+-------------------------
+
+-- |
+-- An operator for removing elements from the sum-types.
+-- E.g.,
+-- 
+-- > Int + Char + Bool - Char
+-- 
+-- is the same type as
+-- 
+-- > Int + Bool
+-- 
+type family a - b where
+
+  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
+
+  -- This group requires the UndecidableInstances extension
+  _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
+
+infixl 0 -
+
+
+-- |
+-- 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.
+data Unsubtracted minuend subtrahend
