singleton-nats 0.3.1.0 → 0.4.0.0
raw patch · 2 files changed
+70/−52 lines, 2 filesdep ~singletonsPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: singletons
API changes (from Hackage documentation)
- Data.Nat: (%:*) :: Sing t_a6Ir -> Sing t_a6Is -> Sing (Apply (Apply (:*$) t_a6Ir) t_a6Is)
- Data.Nat: (%:+) :: Sing t_a6Ip -> Sing t_a6Iq -> Sing (Apply (Apply (:+$) t_a6Ip) t_a6Iq)
- Data.Nat: data (:+$$) (l_a6I6 :: Nat) (l_a6I5 :: TyFun Nat Nat)
- Data.Nat: instance Eq Nat
- Data.Nat: instance Ord Nat
- Data.Nat: instance PEq 'KProxy
- Data.Nat: instance POrd 'KProxy
- Data.Nat: instance SDecide 'KProxy
- Data.Nat: instance SEq 'KProxy
- Data.Nat: instance Show Nat
- Data.Nat: instance SingI 'Z
- Data.Nat: instance SingI n0 => SingI ('S n0)
- Data.Nat: instance SingKind 'KProxy
- Data.Nat: instance SuppressUnusedWarnings (:*$$)
- Data.Nat: instance SuppressUnusedWarnings (:*$)
- Data.Nat: instance SuppressUnusedWarnings (:+$$)
- Data.Nat: instance SuppressUnusedWarnings (:+$)
- Data.Nat: instance SuppressUnusedWarnings SSym0
+ Data.Nat: class (~) (KProxy a0) kproxy0 (KProxy a0) => PNum (kproxy0 :: KProxy a0)
+ Data.Nat: class (~) (KProxy a0) kproxy0 (KProxy a0) => SNum (kproxy0 :: KProxy a0)
+ Data.Nat: instance Data.Singletons.Decide.SDecide 'Data.Proxy.KProxy
+ Data.Nat: instance Data.Singletons.Prelude.Eq.PEq 'Data.Proxy.KProxy
+ Data.Nat: instance Data.Singletons.Prelude.Eq.SEq 'Data.Proxy.KProxy
+ Data.Nat: instance Data.Singletons.Prelude.Num.PNum 'Data.Proxy.KProxy
+ Data.Nat: instance Data.Singletons.Prelude.Num.SNum 'Data.Proxy.KProxy
+ Data.Nat: instance Data.Singletons.Prelude.Ord.POrd 'Data.Proxy.KProxy
+ Data.Nat: instance Data.Singletons.Prelude.Ord.SOrd 'Data.Proxy.KProxy => Data.Singletons.Prelude.Ord.SOrd 'Data.Proxy.KProxy
+ Data.Nat: instance Data.Singletons.SingI 'Data.Nat.Z
+ Data.Nat: instance Data.Singletons.SingI n0 => Data.Singletons.SingI ('Data.Nat.S n0)
+ Data.Nat: instance Data.Singletons.SingKind 'Data.Proxy.KProxy
+ Data.Nat: instance Data.Singletons.SuppressUnusedWarnings.SuppressUnusedWarnings Data.Nat.Compare_1627420094Sym0
+ Data.Nat: instance Data.Singletons.SuppressUnusedWarnings.SuppressUnusedWarnings Data.Nat.Compare_1627420094Sym1
+ Data.Nat: instance Data.Singletons.SuppressUnusedWarnings.SuppressUnusedWarnings Data.Nat.NatAbsSym0
+ Data.Nat: instance Data.Singletons.SuppressUnusedWarnings.SuppressUnusedWarnings Data.Nat.NatMinusSym0
+ Data.Nat: instance Data.Singletons.SuppressUnusedWarnings.SuppressUnusedWarnings Data.Nat.NatMinusSym1
+ Data.Nat: instance Data.Singletons.SuppressUnusedWarnings.SuppressUnusedWarnings Data.Nat.NatMulSym0
+ Data.Nat: instance Data.Singletons.SuppressUnusedWarnings.SuppressUnusedWarnings Data.Nat.NatMulSym1
+ Data.Nat: instance Data.Singletons.SuppressUnusedWarnings.SuppressUnusedWarnings Data.Nat.NatPlusSym0
+ Data.Nat: instance Data.Singletons.SuppressUnusedWarnings.SuppressUnusedWarnings Data.Nat.NatPlusSym1
+ Data.Nat: instance Data.Singletons.SuppressUnusedWarnings.SuppressUnusedWarnings Data.Nat.SSym0
+ Data.Nat: instance GHC.Classes.Eq Data.Nat.Nat
+ Data.Nat: instance GHC.Classes.Ord Data.Nat.Nat
+ Data.Nat: instance GHC.Show.Show Data.Nat.Nat
+ Data.Nat: natAbs :: Nat -> Nat
+ Data.Nat: natMinus :: Nat -> Nat -> Nat
- Data.Nat: data SSym0 (l_a6HZ :: TyFun Nat Nat)
+ Data.Nat: data SSym0 (l_a7fQ :: TyFun Nat Nat)
- Data.Nat: type SNat (z_a6ID :: Nat) = Sing z_a6ID
+ Data.Nat: type SNat = (Sing :: Nat -> *)
- Data.Nat: type SSym1 (t_a6HY :: Nat) = S t_a6HY
+ Data.Nat: type SSym1 (t_a7fP :: Nat) = S t_a7fP
Files
- Data/Nat.hs +48/−30
- singleton-nats.cabal +22/−22
Data/Nat.hs view
@@ -1,60 +1,78 @@ {-# LANGUAGE UndecidableInstances, ScopedTypeVariables, DataKinds, FlexibleInstances, GADTs, TypeFamilies, TemplateHaskell,- TypeOperators #-}+ InstanceSigs, TypeOperators, PolyKinds #-} module Data.Nat ( Nat(..)+ , NatPlus+ , NatMul+ , NatMinus+ , NatAbs , natPlus , natMul+ , natMinus+ , natAbs , SNat- , Data.Singletons.Prelude.Sing(SS, SZ) - , (:*)- , (:*$)- , (:*$$)- , (:+) - , (:+$)- , (:+$$)+ , Data.Singletons.Prelude.Sing(SS, SZ)+ , Data.Singletons.Prelude.PNum+ , Data.Singletons.Prelude.SNum , SSym0(..) , SSym1(..) , ZSym0(..)- , (%:+)- , (%:*) , Lit , SLit ) where import Data.Singletons.TH import Data.Singletons.Prelude-import qualified GHC.TypeLits as Lit+import Unsafe.Coerce+import qualified GHC.TypeLits as Lit $(singletons [d| data Nat = Z | S Nat deriving (Eq, Show, Ord) - (+) :: Nat -> Nat -> Nat- Z + b = b- S a + b = S (a + b)+ natPlus :: Nat -> Nat -> Nat+ natPlus Z b = b+ natPlus (S a) b = S (natPlus a b) - (*) :: Nat -> Nat -> Nat- Z * b = Z- S a * b = b + (a * b) |])+ natMul :: Nat -> Nat -> Nat+ natMul Z b = Z+ natMul (S a) b = natPlus b (natMul a b) -{-| This is the plain value-level version of addition on Nats. There's rarely a reason to use this;-it's included for completeness. -}-natPlus :: Nat -> Nat -> Nat-natPlus = (Data.Nat.+)+ natMinus :: Nat -> Nat -> Nat+ natMinus Z b = Z+ natMinus (S a) (S b) = natMinus a b+ natMinus a Z = a -{-| Similarly to 'natPlus', this one is included for completeness. -}-natMul :: Nat -> Nat -> Nat-natMul = (Data.Nat.*)+ natAbs :: Nat -> Nat+ natAbs n = n+ |]) +instance PNum ('KProxy :: KProxy Nat) where+ type a :+ b = NatPlus a b+ type a :- b = NatMinus a b+ type a :* b = NatMul a b+ type Abs a = NatAbs a+ type Signum (a :: Nat) = Error "Data.Nat: signum not implemented"+ type FromInteger (a :: Lit.Nat) = Lit a++instance SNum ('KProxy :: KProxy Nat) where + (%:+) = sNatPlus+ (%:*) = sNatMul+ (%:-) = sNatMinus+ sAbs = sNatAbs + sSignum = case toSing "Data.Nat: signum not implemented" of+ SomeSing s -> sError s + sFromInteger n = case n %:== (sing :: Sing 0) of+ STrue -> unsafeCoerce SZ+ SFalse -> unsafeCoerce (SS (sFromInteger (n %:- (sing :: Sing 1))))+ {-| Converts a runtime 'Integer' to an existentially wrapped 'Nat'. Returns 'Nothing' if the argument is negative -}-someNat :: Integer -> Maybe (SomeSing (KindOf Z))-someNat n | n < 0 = Nothing-someNat n = Just (go n) where - go 0 = SomeSing SZ- go n = case go (n - 1) of- SomeSing sn -> SomeSing (SS sn)+someNatVal :: Integer -> Maybe (SomeSing (KindOf Z))+someNatVal n = case Lit.someNatVal n of+ Just (Lit.SomeNat (pn :: Proxy n)) -> Just (SomeSing (sFromInteger (sing :: Sing n)))+ Nothing -> Nothing {-| Provides a shorthand for 'Nat'-s using "GHC.TypeLits", for example:
singleton-nats.cabal view
@@ -1,23 +1,23 @@--name: singleton-nats-version: 0.3.1.0-synopsis: Unary natural numbers relying on the singletons infrastructure. -license: BSD3-license-file: LICENSE-author: András Kovács-maintainer: puttamalac@gmail.com-copyright: 2015 András Kovács-category: Data-build-type: Simple--cabal-version: >=1.10--library- exposed-modules:- Data.Nat-- build-depends: - base >=4.7 && <4.9,- singletons >= 1-+ +name: singleton-nats +version: 0.4.0.0 +synopsis: Unary natural numbers relying on the singletons infrastructure. +license: BSD3 +license-file: LICENSE +author: András Kovács +maintainer: puttamalac@gmail.com +copyright: 2015 András Kovács +category: Data +build-type: Simple + +cabal-version: >=1.10 + +library + exposed-modules: + Data.Nat + + build-depends: + base >=4.7 && <4.9, + singletons >= 2.0.1 + default-language: Haskell2010