nats 0.1 → 0.1.2
raw patch · 3 files changed
+59/−5 lines, 3 files
Files
- nats.cabal +3/−5
- src/Numeric/Natural.hs +1/−0
- src/Numeric/Natural/Internal.hs +55/−0
nats.cabal view
@@ -1,15 +1,15 @@ name: nats category: Numeric, Algebra-version: 0.1+version: 0.1.2 license: BSD3-cabal-version: >= 1.10+cabal-version: >= 1.8 license-file: LICENSE author: Edward A. Kmett maintainer: Edward A. Kmett <ekmett@gmail.com> stability: provisional homepage: http://github.com/ekmett/nats/ bug-reports: http://github.com/ekmett/nats/issues-copyright: Copyright (C) 2011 Edward A. Kmett+copyright: Copyright (C) 2011-2013 Edward A. Kmett synopsis: Haskell 98 natural numbers description: Haskell 98 natural numbers@@ -27,11 +27,9 @@ location: git://github.com/ekmett/nats.git library- default-language: Haskell98 hs-source-dirs: src if !impl(hugs)- other-extensions: DeriveDataTypeable cpp-options: -DLANGUAGE_DeriveDataTypeable build-depends: base >= 2 && < 10
src/Numeric/Natural.hs view
@@ -14,6 +14,7 @@ module Numeric.Natural ( Natural , Whole(toNatural)+ , natural ) where import Numeric.Natural.Internal
src/Numeric/Natural/Internal.hs view
@@ -23,6 +23,7 @@ module Numeric.Natural.Internal ( Natural(..) , Whole(..)+ , natural ) where import Data.Word@@ -41,6 +42,12 @@ #endif ) +-- | Church decoding+natural :: a -> (a -> a) -> Natural -> a+natural a _ 0 = a+natural a f n = natural (f a) f (unsafePred n)+{-# INLINEABLE natural #-}+ instance Show Natural where showsPrec d (Natural n) = showsPrec d n @@ -49,57 +56,93 @@ instance Num Natural where Natural n + Natural m = Natural (n + m)+ {-# INLINE (+) #-} Natural n * Natural m = Natural (n * m)+ {-# INLINE (*) #-} Natural n - Natural m | result < 0 = error "Natural.(-): negative result" | otherwise = Natural result where result = n - m+ {-# INLINE (-) #-} abs (Natural n) = Natural n+ {-# INLINE abs #-} signum (Natural n) = Natural (signum n)+ {-# INLINE signum #-} fromInteger n | n >= 0 = Natural n | otherwise = error "Natural.fromInteger: negative"+ {-# INLINE fromInteger #-} instance Bits Natural where Natural n .&. Natural m = Natural (n .&. m)+ {-# INLINE (.&.) #-} Natural n .|. Natural m = Natural (n .|. m)+ {-# INLINE (.|.) #-} xor (Natural n) (Natural m) = Natural (xor n m)+ {-# INLINE xor #-} complement _ = error "Bits.complement: Natural complement undefined"+ {-# INLINE complement #-} shift (Natural n) = Natural . shift n+ {-# INLINE shift #-} rotate (Natural n) = Natural . rotate n+ {-# INLINE rotate #-} bit = Natural . bit+ {-# INLINE bit #-} setBit (Natural n) = Natural . setBit n+ {-# INLINE setBit #-} clearBit (Natural n) = Natural . clearBit n+ {-# INLINE clearBit #-} complementBit (Natural n) = Natural . complementBit n+ {-# INLINE complementBit #-} testBit = testBit . runNatural+ {-# INLINE testBit #-} bitSize = bitSize . runNatural+ {-# INLINE bitSize #-} isSigned _ = False+ {-# INLINE isSigned #-} shiftL (Natural n) = Natural . shiftL n+ {-# INLINE shiftL #-} shiftR (Natural n) = Natural . shiftR n+ {-# INLINE shiftR #-} rotateL (Natural n) = Natural . rotateL n+ {-# INLINE rotateL #-} rotateR (Natural n) = Natural . rotateR n+ {-# INLINE rotateR #-} #if MIN_VERSION_base(4,6,0) popCount = popCountDefault+ {-# INLINE popCount #-} #endif instance Real Natural where toRational (Natural a) = toRational a+ {-# INLINE toRational #-} instance Enum Natural where pred (Natural 0) = error "Natural.pred: 0" pred (Natural n) = Natural (pred n)+ {-# INLINE pred #-} succ (Natural n) = Natural (succ n)+ {-# INLINE succ #-} fromEnum (Natural n) = fromEnum n+ {-# INLINE fromEnum #-} toEnum n | n < 0 = error "Natural.toEnum: negative" | otherwise = Natural (toEnum n)+ {-# INLINE toEnum #-} instance Integral Natural where quot (Natural a) (Natural b) = Natural (quot a b)+ {-# INLINE quot #-} rem (Natural a) (Natural b) = Natural (rem a b)+ {-# INLINE rem #-} div (Natural a) (Natural b) = Natural (div a b)+ {-# INLINE div #-} mod (Natural a) (Natural b) = Natural (mod a b)+ {-# INLINE mod #-} divMod (Natural a) (Natural b) = (Natural q, Natural r) where (q,r) = divMod a b+ {-# INLINE divMod #-} quotRem (Natural a) (Natural b) = (Natural q, Natural r) where (q,r) = quotRem a b+ {-# INLINE quotRem #-} toInteger = runNatural+ {-# INLINE toInteger #-} -- | A refinement of 'Integral' to represent types that do not contain negative numbers. class Integral n => Whole n where@@ -109,23 +152,35 @@ instance Whole Word where toNatural = Natural . toInteger unsafePred n = n - 1+ {-# INLINE toNatural #-}+ {-# INLINE unsafePred #-} instance Whole Word8 where toNatural = Natural . toInteger unsafePred n = n - 1+ {-# INLINE toNatural #-}+ {-# INLINE unsafePred #-} instance Whole Word16 where toNatural = Natural . toInteger unsafePred n = n - 1+ {-# INLINE toNatural #-}+ {-# INLINE unsafePred #-} instance Whole Word32 where toNatural = Natural . toInteger unsafePred n = n - 1+ {-# INLINE toNatural #-}+ {-# INLINE unsafePred #-} instance Whole Word64 where toNatural = Natural . toInteger unsafePred n = n - 1+ {-# INLINE toNatural #-}+ {-# INLINE unsafePred #-} instance Whole Natural where toNatural = id unsafePred (Natural n) = Natural (n - 1)+ {-# INLINE toNatural #-}+ {-# INLINE unsafePred #-}