packages feed

type-natural 0.4.0.0 → 0.4.1.0

raw patch · 4 files changed

+124/−164 lines, 4 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Data.Type.Natural: eqPreserveSS :: n :=: m -> S n :=: S m
- Data.Type.Natural: pluSSR :: SNat n -> SNat m -> S (n :+: m) :=: (n :+: S m)
- Data.Type.Natural: pluSZL :: SNat n -> (Z :+: n) :=: n
- Data.Type.Natural: pluSZR :: SNat n -> (n :+: Z) :=: n
+ Data.Type.Natural: eqPreservesS :: n :=: m -> S n :=: S m
+ Data.Type.Natural: minusCongL :: n :=: m -> SNat l -> (n :-: l) :=: (m :-: l)
+ Data.Type.Natural: multAssoc :: SNat n -> SNat m -> SNat l -> (n :* (m :* l)) :=: ((n :* m) :* l)
+ Data.Type.Natural: multPlusDistrib :: forall n m l. SNat n -> SNat m -> SNat l -> (n :* (m :+ l)) :=: ((n :* m) :+ (n :* l))
+ Data.Type.Natural: plusAssoc :: SNat n -> SNat m -> SNat l -> (n :+: (m :+: l)) :=: ((n :+: m) :+: l)
+ Data.Type.Natural: plusComm :: SNat n -> SNat m -> (n :+: m) :=: (m :+: n)
+ Data.Type.Natural: plusMultDistrib :: SNat n -> SNat m -> SNat l -> ((n :+ m) :* l) :=: ((n :* l) :+ (m :* l))
+ Data.Type.Natural: plusSR :: SNat n -> SNat m -> S (n :+: m) :=: (n :+: S m)
+ Data.Type.Natural: plusSuccL :: SNat n -> SNat m -> (S n :+ m) :=: S (n :+ m)
+ Data.Type.Natural: plusSuccR :: SNat n -> SNat m -> (n :+ S m) :=: S (n :+ m)
+ Data.Type.Natural: plusZL :: SNat n -> (Z :+: n) :=: n
+ Data.Type.Natural: plusZR :: SNat n -> (n :+: Z) :=: n
+ Data.Type.Natural: succAndPlusOneR :: SNat n -> S n :=: (n :+: One)
+ Data.Type.Natural: succCong :: n :=: m -> S n :=: S m
+ Data.Type.Natural: succInj :: S n :=: S m -> n :=: m

Files

Data/Type/Natural.hs view
@@ -35,14 +35,19 @@                           -- * Quasi quotes for natural numbers                           nat, snat,                           -- * Properties of natural numbers-                          succCongEq, plusCongR, plusCongL, succPlusL, succPlusR,-                          pluSZR, pluSZL, eqPreserveSS, plusAssociative,-                          multAssociative, multComm, multZL, multZR, multOneL,-                          multOneR, snEqZAbsurd, succInjective, plusInjectiveL, plusInjectiveR,-                          plusMultDistr, multPlusDistr, multCongL, multCongR,-                          sAndPlusOne, plusCommutative, minusCongEq, minusNilpotent,+                          succCongEq, eqPreservesS, succCong, plusCongR, plusCongL,+                          succPlusL, plusSuccL, succPlusR, plusSuccR,+                          plusZR, plusZL, plusAssociative, plusAssoc,+                          multAssociative, multAssoc, multComm, multZL, multZR, multOneL,+                          multOneR, snEqZAbsurd, succInjective, succInj,+                          plusInjectiveL, plusInjectiveR,+                          plusMultDistr, plusMultDistrib, multPlusDistr, multPlusDistrib,+                          multCongL, multCongR,+                          sAndPlusOne, succAndPlusOneR,+                          plusComm, plusCommutative, minusCongEq, minusCongL,+                          minusNilpotent,                           eqSuccMinus, plusMinusEqL, plusMinusEqR,-                          zAbsorbsMinR, zAbsorbsMinL, pluSSR, plusNeutralR, plusNeutralL,+                          zAbsorbsMinR, zAbsorbsMinL, plusSR, plusNeutralR, plusNeutralL,                           leqRhs, leqLhs, minComm, maxZL, maxComm, maxZR,                           -- * Properties of ordering 'Leq'                           leqRefl, leqSucc, leqTrans, plusMonotone, plusLeqL, plusLeqR,@@ -114,27 +119,31 @@ -------------------------------------------------- -- * Properties ---------------------------------------------------pluSZR :: SNat n -> n :+: 'Z :=: n-pluSZR SZ     = Refl-pluSZR (SS n) =+plusZR :: SNat n -> n :+: 'Z :=: n+plusZR SZ     = Refl+plusZR (SS n) =  start (SS n %+ SZ)    =~= SS (n %+ SZ)-   === SS n          `because` cong' SS (pluSZR n)--eqPreserveSS :: n :=: m -> 'S n :=: 'S m-eqPreserveSS Refl = Refl+   === SS n          `because` cong' SS (plusZR n) -pluSZL :: SNat n -> 'Z :+: n :=: n-pluSZL _ = Refl+plusZL :: SNat n -> 'Z :+: n :=: n+plusZL _ = Refl -succCongEq :: n :=: m -> 'S n :=: 'S m-succCongEq Refl = Refl+succCong, succCongEq, eqPreservesS :: n :=: m -> 'S n :=: 'S m+succCong Refl = Refl+succCongEq = succCong+{-# DEPRECATED succCongEq "Will be removed in @0.5.0.0@. Use @'succCong'@ instead." #-}+eqPreservesS = succCong+{-# DEPRECATED eqPreservesS "Will be removed in @0.5.0.0@. Use @'succCong'@ instead." #-}  snEqZAbsurd :: 'S n :=: 'Z -> a snEqZAbsurd _ = bugInGHC -succInjective :: 'S n :=: 'S m -> n :=: m-succInjective Refl = Refl+succInj, succInjective :: 'S n :=: 'S m -> n :=: m+succInj Refl = Refl+succInjective = succInj+{-# DEPRECATED succInjective "Will be removed in @0.5.0.0@. \+                              Use @'succInj'@ instead." #-}  plusInjectiveL :: SNat n -> SNat m -> SNat l -> n :+ m :=: n :+ l -> m :=: l plusInjectiveL SZ     _ _ Refl = Refl@@ -147,50 +156,66 @@     === m %:+ l   `because` eq     === l %:+ m   `because` plusCommutative m l -sAndPlusOne :: SNat n -> 'S n :=: n :+: One-sAndPlusOne SZ = Refl-sAndPlusOne (SS n) =+succAndPlusOneR, sAndPlusOne :: SNat n -> 'S n :=: n :+: One+succAndPlusOneR SZ = Refl+succAndPlusOneR (SS n) =   start (SS (SS n))-    === SS (n %+ sOne) `because` cong' SS (sAndPlusOne n)+    === SS (n %+ sOne) `because` cong' SS (succAndPlusOneR n)     =~= SS n %+ sOne+sAndPlusOne = succAndPlusOneR+{-# DEPRECATED sAndPlusOne "Will be removed in @0.5.0.0@. Use @'succAndPlusOneR'@ instead." #-} -plusAssociative :: SNat n -> SNat m -> SNat l+plusAssoc, plusAssociative :: SNat n -> SNat m -> SNat l                 -> n :+: (m :+: l) :=: (n :+: m) :+: l-plusAssociative SZ     _ _ = Refl-plusAssociative (SS n) m l =+plusAssoc SZ     _ _ = Refl+plusAssoc (SS n) m l =   start (SS n %+ (m %+ l))     =~= SS (n %+ (m %+ l))-    === SS ((n %+ m) %+ l)  `because` cong' SS (plusAssociative n m l)+    === SS ((n %+ m) %+ l)  `because` cong' SS (plusAssoc n m l)     =~= SS (n %+ m) %+ l     =~= (SS n %+ m) %+ l+plusAssociative = plusAssoc+{-# DEPRECATED plusAssociative "Will be removed in @0.5.0.0@. Use @'plusAssoc'@ instead." #-} -pluSSR :: SNat n -> SNat m -> 'S (n :+: m) :=: n :+: 'S m-pluSSR n m =+plusSR :: SNat n -> SNat m -> 'S (n :+: m) :=: n :+: 'S m+plusSR n m =   start (SS (n %+ m))-    === (n %+ m) %+ sOne `because` sAndPlusOne (n %+ m)-    === n %+ (m %+ sOne) `because` symmetry (plusAssociative n m sOne)-    === n %+ SS m        `because` plusCongL n (symmetry $ sAndPlusOne m)+    === (n %+ m) %+ sOne `because` succAndPlusOneR (n %+ m)+    === n %+ (m %+ sOne) `because` symmetry (plusAssoc n m sOne)+    === n %+ SS m        `because` plusCongL n (symmetry $ succAndPlusOneR m) +{-# DEPRECATED plusSR "Will be removed in @0.5.0.0@. Use @'plusSuccR'@ instead." #-}++ plusCongL :: SNat n -> m :=: m' -> n :+ m :=: n :+ m' plusCongL _ Refl = Refl  plusCongR :: SNat n -> m :=: m' -> m :+ n :=: m' :+ n plusCongR _ Refl = Refl -succPlusL :: SNat n -> SNat m -> 'S n :+ m :=: 'S (n :+ m)-succPlusL _ _ = Refl+plusSuccL, succPlusL :: SNat n -> SNat m -> 'S n :+ m :=: 'S (n :+ m)+plusSuccL _ _ = Refl+succPlusL = plusSuccL+{-# DEPRECATED succPlusL "Will be removed in @0.5.0.0@. Use @'plusSuccL'@ instead." #-} -succPlusR :: SNat n -> SNat m -> n :+ 'S m :=: 'S (n :+ m)-succPlusR SZ     _ = Refl-succPlusR (SS n) m =+plusSuccR, succPlusR :: SNat n -> SNat m -> n :+ 'S m :=: 'S (n :+ m)+plusSuccR SZ     _ = Refl+plusSuccR (SS n) m =   start (SS n %+ SS m)     =~= SS (n %+ SS m)-    === SS (SS (n %+ m)) `because` succCongEq (succPlusR n m)+    === SS (SS (n %+ m)) `because` succCong (plusSuccR n m)     =~= SS (SS n %+ m) -minusCongEq :: n :=: m -> SNat l -> n :-: l :=: m :-: l-minusCongEq Refl _ = Refl+succPlusR = plusSuccR +{-# DEPRECATED succPlusR "Will be removed in @0.5.0.0@. Use @'plusSuccR'@ instead." #-}+++minusCongEq, minusCongL :: n :=: m -> SNat l -> n :-: l :=: m :-: l+minusCongL Refl _ = Refl+minusCongEq = minusCongL+{-# DEPRECATED minusCongEq "Will be removed in @0.5.0.0@. Use @'minusCongEq'@ instead." #-}+ minusNilpotent :: SNat n -> n :-: n :=: Zero minusNilpotent SZ = Refl minusNilpotent (SS n) =@@ -198,21 +223,25 @@     =~= n %:- n     === SZ     `because` minusNilpotent n -plusCommutative :: SNat n -> SNat m -> n :+: m :=: m :+: n-plusCommutative SZ SZ     = Refl-plusCommutative SZ (SS m) =++plusComm, plusCommutative :: SNat n -> SNat m -> n :+: m :=: m :+: n+plusComm SZ SZ     = Refl+plusComm SZ (SS m) =   start (SZ %+ SS m)     =~= SS m     === SS (m %+ SZ) `because` cong' SS (plusCommutative SZ m)     =~= SS m %+ SZ-plusCommutative (SS n) m =+plusComm (SS n) m =   start (SS n %+ m)     =~= SS (n %+ m)     === SS (m %+ n)      `because` cong' SS (plusCommutative n m)-    === (m %+ n) %+ sOne `because` sAndPlusOne (m %+ n)-    === m %+ (n %+ sOne) `because` symmetry (plusAssociative m n sOne)-    === m %+ SS n        `because` plusCongL m (symmetry $ sAndPlusOne n)+    === (m %+ n) %+ sOne `because` succAndPlusOneR (m %+ n)+    === m %+ (n %+ sOne) `because` symmetry (plusAssoc m n sOne)+    === m %+ SS n        `because` plusCongL m (symmetry $ succAndPlusOneR n) +plusCommutative = plusComm+{-# DEPRECATED plusCommutative "Will be removed in @0.5.0.0@. Use @'plusComm'@ instead." #-}+ eqSuccMinus :: ((m :<<= n) ~ 'True)             => SNat n -> SNat m -> ('S n :-: m) :=: ('S (n :-: m)) eqSuccMinus _      SZ     = Refl@@ -230,7 +259,7 @@ plusMinusEqL SZ     m = minusNilpotent m plusMinusEqL (SS n) m =   case propToBoolLeq (plusLeqR n m) of-    Dict -> transitivity (eqSuccMinus (n %+ m) m) (eqPreserveSS $ plusMinusEqL n m)+    Dict -> transitivity (eqSuccMinus (n %+ m) m) (succCong $ plusMinusEqL n m)  plusMinusEqR :: SNat n -> SNat m -> (m :+: n) :-: m :=: n plusMinusEqR n m = transitivity (minusCongEq (plusCommutative m n) m) (plusMinusEqL n m)@@ -264,44 +293,50 @@ maxZR :: SNat n -> Max n 'Z :=: n maxZR n = transitivity (maxComm n SZ) (maxZL n) -multPlusDistr :: forall n m l. SNat n -> SNat m -> SNat l -> n :* (m :+ l) :=: (n :* m) :+ (n :* l)-multPlusDistr SZ     _ _ = Refl-multPlusDistr (SS (n :: SNat n')) m l =+multPlusDistr, multPlusDistrib :: forall n m l. SNat n -> SNat m -> SNat l -> n :* (m :+ l) :=: (n :* m) :+ (n :* l)+multPlusDistrib SZ     _ _ = Refl+multPlusDistrib (SS (n :: SNat n')) m l =   start (SS n %* (m %+ l))     =~= (n %* (m %+ l)) %+ (m %+ l)     === ((n %* m) %+ (n %* l)) %+ (m %+ l)-        `because` plusCongR (m %+ l) (multPlusDistr n m l :: n' :* (m :+ l) :=: (n' :* m) :+ (n' :* l))+        `because` plusCongR (m %+ l) (multPlusDistrib n m l :: n' :* (m :+ l) :=: (n' :* m) :+ (n' :* l))     === (n %* m) %+ (n %* l) %+ (l %+ m) `because` plusCongL ((n %* m) %+ (n %* l)) (plusCommutative m l)-    === n %* m %+ (n %*l %+ (l %+ m))    `because` symmetry (plusAssociative (n %* m) (n %* l) (l %+ m))+    === n %* m %+ (n %*l %+ (l %+ m))    `because` symmetry (plusAssoc (n %* m) (n %* l) (l %+ m))     === n %* l %+ (l %+ m) %+ n %* m     `because` plusCommutative (n %* m) (n %*l %+ (l %+ m))-    === (n %* l %+ l) %+ m %+ n %* m     `because` plusCongR (n %* m) (plusAssociative (n %* l) l m)+    === (n %* l %+ l) %+ m %+ n %* m     `because` plusCongR (n %* m) (plusAssoc (n %* l) l m)     =~= (SS n %* l)   %+ m %+ n %* m-    === (SS n %* l)   %+ (m %+ (n %* m)) `because` symmetry (plusAssociative (SS n %* l) m (n %* m))+    === (SS n %* l)   %+ (m %+ (n %* m)) `because` symmetry (plusAssoc (SS n %* l) m (n %* m))     === (SS n %* l)   %+ ((n %* m) %+ m) `because` plusCongL (SS n %* l) (plusCommutative m (n %* m))     =~= (SS n %* l)   %+ (SS n %* m)     === (SS n %* m)   %+ (SS n %* l)     `because` plusCommutative (SS n %* l) (SS n %* m)+multPlusDistr = multPlusDistrib+{-# DEPRECATED plusMultDistrib "Will be removed in @0.5.0.0@. Use @'plusMultDistirb'@ instead." #-} -plusMultDistr :: SNat n -> SNat m -> SNat l -> (n :+ m) :* l :=: (n :* l) :+ (m :* l)-plusMultDistr SZ _ _ = Refl-plusMultDistr (SS n) m l =+plusMultDistr, plusMultDistrib :: SNat n -> SNat m -> SNat l -> (n :+ m) :* l :=: (n :* l) :+ (m :* l)+plusMultDistrib SZ _ _ = Refl+plusMultDistrib (SS n) m l =   start ((SS n %+ m) %* l)     =~= SS (n %+ m) %* l     =~= (n %+ m) %* l %+ l-    === n %* l  %+  m %* l  %+  l   `because` plusCongR l (plusMultDistr n m l)+    === n %* l  %+  m %* l  %+  l   `because` plusCongR l (plusMultDistrib n m l)     === m %* l  %+  n %* l  %+  l   `because` plusCongR l (plusCommutative (n %* l) (m %* l))-    === m %* l  %+ (n %* l  %+  l)  `because` symmetry (plusAssociative (m %* l) (n %*l) l)+    === m %* l  %+ (n %* l  %+  l)  `because` symmetry (plusAssoc (m %* l) (n %*l) l)     =~= m %* l  %+ (SS n %* l)     === (SS n %* l)  %+  (m %* l)   `because` plusCommutative (m %* l) (SS n %* l) -multAssociative :: SNat n -> SNat m -> SNat l -> n :* (m :* l) :=: (n :* m) :* l-multAssociative SZ     _ _ = Refl-multAssociative (SS n) m l =+plusMultDistr = plusMultDistrib+{-# DEPRECATED multPlusDistrib "Will be removed in @0.5.0.0@. Use @'multPlusDistirb'@ instead." #-}++multAssoc, multAssociative :: SNat n -> SNat m -> SNat l -> n :* (m :* l) :=: (n :* m) :* l+multAssoc SZ     _ _ = Refl+multAssoc (SS n) m l =   start (SS n %* (m %* l))     =~= n %* (m %* l) %+ (m %* l)-    === (n %* m) %* l %+ (m %* l) `because` plusCongR (m %* l) (multAssociative n m l)-    === (n %* m %+ m) %* l        `because` symmetry (plusMultDistr (n %* m) m l)+    === (n %* m) %* l %+ (m %* l) `because` plusCongR (m %* l) (multAssoc n m l)+    === (n %* m %+ m) %* l        `because` symmetry (plusMultDistrib (n %* m) m l)     =~= (SS n %* m) %* l-+multAssociative = multAssoc+{-# DEPRECATED multAssociative "Will be removed in @0.5.0.0@. Use @'multAssoc'@ instead." #-} multZL :: SNat m -> Zero :* m :=: Zero multZL _ = Refl @@ -326,7 +361,7 @@   start (SS n %* sOne)     =~= n %* sOne %+ sOne     === n %+ sOne         `because` plusCongR sOne (multOneR n)-    === SS n              `because` symmetry (sAndPlusOne n)+    === SS n              `because` symmetry (succAndPlusOneR n)  multCongL :: SNat n -> m :=: l -> n :* m :=: n :* l multCongL _ Refl = Refl@@ -344,8 +379,8 @@     =~= n %* m %+ m     === m %* n %+ m          `because` plusCongR m (multComm n m)     === m %* n %+ m %* sOne  `because` plusCongL (m %* n) (symmetry $ multOneR m)-    === m %* (n %+ sOne)     `because` symmetry (multPlusDistr m n sOne)-    === m %* SS n            `because` multCongL m (symmetry $ sAndPlusOne n)+    === m %* (n %+ sOne)     `because` symmetry (multPlusDistrib m n sOne)+    === m %* SS n            `because` multCongL m (symmetry $ succAndPlusOneR n)  plusNeutralR :: SNat n -> SNat m -> n :+ m :=: n -> m :=: 'Z plusNeutralR SZ m eq =@@ -386,12 +421,12 @@ plusMonotone :: Leq n m -> Leq l k -> Leq (n :+: l) (m :+: k) plusMonotone (ZeroLeq m) (ZeroLeq k) = ZeroLeq (m %+ k) plusMonotone (ZeroLeq m) (SuccLeqSucc leq) =-  case pluSSR m (leqRhs leq) of+  case sym $ plusSuccR m (leqRhs leq) of     Refl -> SuccLeqSucc $ plusMonotone (ZeroLeq m) leq plusMonotone (SuccLeqSucc leq) leq' = SuccLeqSucc $ plusMonotone leq leq'  plusLeqL :: SNat n -> SNat m -> Leq n (n :+: m)-plusLeqL SZ     m = ZeroLeq $ coerce (symmetry $ pluSZL m) m+plusLeqL SZ     m = ZeroLeq $ coerce (symmetry $ plusZL m) m plusLeqL (SS n) m =   start (SS n)     =<= SS (n %+ m) `because` SuccLeqSucc (plusLeqL n m)@@ -412,7 +447,7 @@  leqAnitsymmetric :: Leq n m -> Leq m n -> n :=: m leqAnitsymmetric (ZeroLeq _) (ZeroLeq _) = Refl-leqAnitsymmetric (SuccLeqSucc leq1) (SuccLeqSucc leq2) = eqPreserveSS $ leqAnitsymmetric leq1 leq2+leqAnitsymmetric (SuccLeqSucc leq1) (SuccLeqSucc leq2) = succCong $ leqAnitsymmetric leq1 leq2 #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ < 800 leqAnitsymmetric _ _ = error "impossible!" #endif
Data/Type/Natural/Builtin.hs view
@@ -39,7 +39,7 @@ import           Data.Singletons.Prelude.Enum (Pred, sPred, sSucc) import           Data.Singletons.Prelude.Num  (SNum (..)) import           Data.Type.Natural            (Nat (S, Z), Sing (SS, SZ))-import           Data.Type.Natural            (plusCongR, succCongEq)+import           Data.Type.Natural            (plusCongR) import qualified Data.Type.Natural            as PN import           Data.Void                    (absurd) import qualified GHC.TypeLits                 as TL@@ -101,7 +101,7 @@   start (sToPeano (sFromPeano (SS sn)))     =~= sToPeano (sSucc (sFromPeano sn))     === SS (sToPeano (sFromPeano sn)) `because` toPeanoSuccCong (sFromPeano sn)-    === SS sn                         `because` succCongEq (toFromPeano sn)+    === SS sn                         `because` PN.succCong (toFromPeano sn)  congFromPeano :: n :=: m -> FromPeano n :=: FromPeano m congFromPeano Refl = Refl@@ -157,7 +157,7 @@         === SS (sToPeano (pn %:+ sm))             `because` toPeanoSuccCong (pn %:+ sm)         === SS (sToPeano pn %:+ sToPeano sm)-            `because` succCongEq (toPeanoPlusCong pn sm)+            `because` PN.succCong (toPeanoPlusCong pn sm)         =~= SS (sToPeano pn) %:+ sToPeano sm         === (sToPeano (sSucc pn) %:+ sToPeano sm)             `because` plusCongR (sToPeano sm) (sym (toPeanoSuccCong pn))
Data/Type/Natural/Definitions.hs view
@@ -1,31 +1,19 @@-{-# LANGUAGE CPP, DataKinds, DeriveDataTypeable, FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances, GADTs, KindSignatures             #-}-{-# LANGUAGE MultiParamTypeClasses, NoImplicitPrelude, PolyKinds  #-}-{-# LANGUAGE RankNTypes, ScopedTypeVariables, StandaloneDeriving  #-}-{-# LANGUAGE TemplateHaskell, TypeFamilies, TypeOperators         #-}-{-# LANGUAGE UndecidableInstances                                 #-}-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ > 708-{-# LANGUAGE InstanceSigs #-}-#endif+{-# LANGUAGE DataKinds, DeriveDataTypeable, FlexibleContexts        #-}+{-# LANGUAGE FlexibleInstances, GADTs, InstanceSigs, KindSignatures #-}+{-# LANGUAGE MultiParamTypeClasses, NoImplicitPrelude, PolyKinds    #-}+{-# LANGUAGE RankNTypes, ScopedTypeVariables, StandaloneDeriving    #-}+{-# LANGUAGE TemplateHaskell, TypeFamilies, TypeOperators           #-}+{-# LANGUAGE UndecidableInstances                                   #-} module Data.Type.Natural.Definitions        (module Data.Type.Natural.Definitions,-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 710         module Data.Singletons.Prelude-#endif        ) where-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 708-import Data.Singletons.TH (singletons)-#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 710-import Data.Singletons.Prelude-import Prelude                 (Num (..), Ord (..))-#else-import Data.Singletons.Prelude hiding ((:<=), Max, MaxSym0, MaxSym1, MaxSym2,-                                Min, MinSym0, MinSym1, MinSym2, SOrd (..))-#endif-#endif-import           Data.Typeable (Typeable)-import           Prelude       (Bool (..), Eq (..), Show (..))-import qualified Prelude       as P+import           Data.Singletons.Prelude+import           Data.Singletons.TH      (singletons)+import           Data.Typeable           (Typeable)+import           Prelude                 (Num (..), Ord (..))+import           Prelude                 (Bool (..), Eq (..), Show (..))+import qualified Prelude                 as P   @@ -37,41 +25,14 @@             deriving (Show, Eq)  |] -#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 708 deriving instance Typeable 'S deriving instance Typeable 'Z-#endif  -------------------------------------------------- -- ** Arithmetic functions. -------------------------------------------------- -#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ < 710 singletons [d|- -- | Minimum function.- min :: Nat -> Nat -> Nat- min Z     Z     = Z- min Z     (S _) = Z- min (S _) Z     = Z- min (S m) (S n) = S (min m n)-- -- | Maximum function.- max :: Nat -> Nat -> Nat- max Z     Z     = Z- max Z     (S n) = S n- max (S n) Z     = S n- max (S n) (S m) = S (max n m)- |]--instance P.Ord Nat where-  Z   <= _   = True-  S _ <= Z   = False-  S n <= S m = n P.<= m--  min = min-  max = max-#else-singletons [d|   instance P.Ord Nat where      Z   <= _   = True      S _ <= Z   = False@@ -87,9 +48,7 @@      max (S n) Z     = S n      max (S n) (S m) = S (max n m)  |]-#endif -#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 710 singletons [d|   instance P.Num Nat where     Z   + n = n@@ -109,40 +68,6 @@      fromInteger n = if n == 0 then Z else S (fromInteger (n-1))  |]-#else-singletons [d|- (+) :: Nat -> Nat -> Nat- Z   + n = n- S m + n = S (m + n)-- (-) :: Nat -> Nat -> Nat- n   - Z   = n- S n - S m = n - m- Z   - S _ = Z-- (*) :: Nat -> Nat -> Nat- Z   * _ = Z- S n * m = n * m + m- |]--infixl 6 %:-, ---infixl 6 %:+, :+--infixl 7 %:*, :*--instance P.Num Nat where-  n - m = n - m-  n + m = n + m-  n * m = n * m-  abs = id-  signum Z = Z-  signum _ = S Z-  fromInteger 0             = Z-  fromInteger n | n P.< 0   = error "negative integer"-                | otherwise = S $ P.fromInteger (n P.- 1)--#endif  type n :-: m = n :- m type n :+: m = n :+ m
type-natural.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/  name:                type-natural-version:             0.4.0.0+version:             0.4.1.0 synopsis:            Type-level natural and proofs of their properties. description:         Type-level natural numbers and proofs of their properties. homepage:            https://github.com/konn/type-natural