NumInstances-1.3/0000755000000000000000000000000012136055507012156 5ustar0000000000000000NumInstances-1.3/LICENSE0000644000000000000000000000276312136055506013172 0ustar0000000000000000Copyright (c)2011, Conal Elliott All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Conal Elliott nor the names of other contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NumInstances-1.3/NumInstances.cabal0000644000000000000000000000255112136055507015554 0ustar0000000000000000Name: NumInstances Version: 1.3 Synopsis: Instances of numeric classes for functions and tuples Description: Instances of numeric classes for functions and tuples. Import "Data.NumInstances" to get all the instances. If you want only function or only tuple instances, import "Data.NumInstances.Function" or "Data.NumInstances.Tuple". License: BSD3 License-file: LICENSE Author: Conal Elliott Maintainer: conal@conal.net Category: Data Build-type: Simple Cabal-version: >=1.8 Homepage: https://github.com/conal/NumInstances Extra-Source-Files: src-draconian-Num/Data/NumInstances/PreRequisites.hs, src-relaxed-Num/Data/NumInstances/PreRequisites.hs Source-Repository head type: git location: git://github.com/conal/NumInstances.git Library hs-Source-Dirs: src Exposed-modules: Data.NumInstances, Data.NumInstances.Function, Data.NumInstances.Tuple Build-Depends: base<5 Other-modules: Data.NumInstances.Util, Data.NumInstances.PreRequisites if impl(ghc < 7.4) hs-Source-Dirs: src-draconian-Num else hs-Source-Dirs: src-relaxed-Num -- This module used to be part of vector-space ghc-prof-options: -prof -auto-all NumInstances-1.3/Setup.hs0000644000000000000000000000005612136055507013613 0ustar0000000000000000import Distribution.Simple main = defaultMain NumInstances-1.3/src/0000755000000000000000000000000012136055506012744 5ustar0000000000000000NumInstances-1.3/src/Data/0000755000000000000000000000000012136055506013615 5ustar0000000000000000NumInstances-1.3/src/Data/NumInstances.hs0000644000000000000000000000101712136055506016557 0ustar0000000000000000{-# OPTIONS_GHC -Wall -fno-warn-orphans #-} ---------------------------------------------------------------------- -- | -- Module : Data.NumInstances -- Copyright : (c) Conal Elliott 2008-2013 -- License : BSD3 -- -- Maintainer : conal@conal.net -- Stability : experimental -- -- Number class instances for functions and tuples ---------------------------------------------------------------------- module Data.NumInstances () where import Data.NumInstances.Function () import Data.NumInstances.Tuple () NumInstances-1.3/src/Data/NumInstances/0000755000000000000000000000000012136055506016224 5ustar0000000000000000NumInstances-1.3/src/Data/NumInstances/Function.hs0000644000000000000000000000226612136055506020353 0ustar0000000000000000{-# OPTIONS_GHC -Wall -fno-warn-orphans #-} ---------------------------------------------------------------------- -- | -- Module : Data.NumInstances.Function -- Copyright : (c) Conal Elliott 2008-2013 -- License : BSD3 -- -- Maintainer : conal@conal.net -- Stability : experimental -- -- Number class instances for functions ---------------------------------------------------------------------- module Data.NumInstances.Function () where import Control.Applicative import Data.NumInstances.PreRequisites () -- Eq, Ord, Show, if necessary instance Num b => Num (a->b) where negate = fmap negate (+) = liftA2 (+) (*) = liftA2 (*) fromInteger = pure . fromInteger abs = fmap abs signum = fmap signum instance Fractional b => Fractional (a->b) where recip = fmap recip fromRational = pure . fromRational instance Floating b => Floating (a->b) where pi = pure pi sqrt = fmap sqrt exp = fmap exp log = fmap log sin = fmap sin cos = fmap cos asin = fmap asin atan = fmap atan acos = fmap acos sinh = fmap sinh cosh = fmap cosh asinh = fmap asinh atanh = fmap atanh acosh = fmap acosh NumInstances-1.3/src/Data/NumInstances/Tuple.hs0000644000000000000000000001327612136055506017662 0ustar0000000000000000{-# OPTIONS_GHC -Wall -fno-warn-orphans #-} ---------------------------------------------------------------------- -- | -- Module : Data.NumInstances.Tuple -- Copyright : (c) Conal Elliott 2008-2013 -- License : BSD3 -- -- Maintainer : conal@conal.net -- Stability : experimental -- -- Number class instances for tuples ---------------------------------------------------------------------- module Data.NumInstances.Tuple () where lift2 :: (a->u) -> (b->v) -> (a,b) -> (u,v) lift2 f g (a,b) = (f a, g b) -- Equivalently, lift2 = (***) instance (Num a, Num b) => Num (a,b) where fromInteger n = (fromInteger n, fromInteger n) (a,b) + (a',b') = (a+a',b+b') (a,b) - (a',b') = (a-a',b-b') (a,b) * (a',b') = (a*a',b*b') negate = lift2 negate negate abs = lift2 abs abs signum = lift2 signum signum instance (Fractional a, Fractional b) => Fractional (a,b) where fromRational x = (fromRational x, fromRational x) recip = lift2 recip recip instance (Floating a, Floating b) => Floating (a,b) where pi = (pi,pi) exp = lift2 exp exp log = lift2 log log sqrt = lift2 sqrt sqrt sin = lift2 sin sin cos = lift2 cos cos sinh = lift2 sinh sinh cosh = lift2 cosh cosh asin = lift2 asin asin acos = lift2 acos acos atan = lift2 atan atan asinh = lift2 asinh asinh acosh = lift2 acosh acosh atanh = lift2 atanh atanh instance (Num a, Num b, Num c) => Num (a,b,c) where fromInteger n = (fromInteger n, fromInteger n, fromInteger n) (a,b,c) + (a',b',c') = (a+a',b+b',c+c') (a,b,c) - (a',b',c') = (a-a',b-b',c-c') (a,b,c) * (a',b',c') = (a*a',b*b',c*c') negate = lift3 negate negate negate abs = lift3 abs abs abs signum = lift3 signum signum signum instance (Fractional a, Fractional b, Fractional c) => Fractional (a,b,c) where fromRational x = (fromRational x, fromRational x, fromRational x) recip = lift3 recip recip recip lift3 :: (a->u) -> (b->v) -> (c->w) -> (a,b,c) -> (u,v,w) lift3 f g h (a,b,c) = (f a, g b, h c) instance (Floating a, Floating b, Floating c) => Floating (a,b,c) where pi = (pi,pi,pi) exp = lift3 exp exp exp log = lift3 log log log sqrt = lift3 sqrt sqrt sqrt sin = lift3 sin sin sin cos = lift3 cos cos cos sinh = lift3 sinh sinh sinh cosh = lift3 cosh cosh cosh asin = lift3 asin asin asin acos = lift3 acos acos acos atan = lift3 atan atan atan asinh = lift3 asinh asinh asinh acosh = lift3 acosh acosh acosh atanh = lift3 atanh atanh atanh lift4 :: (a->u) -> (b->v) -> (c->w) -> (d->x) -> (a,b,c,d) -> (u,v,w,x) lift4 f g h k (a,b,c,d) = (f a, g b, h c, k d) instance (Num a, Num b, Num c, Num d) => Num (a,b,c,d) where fromInteger n = (fromInteger n, fromInteger n, fromInteger n, fromInteger n) (a,b,c,d) + (a',b',c',d') = (a+a',b+b',c+c',d+d') (a,b,c,d) - (a',b',c',d') = (a-a',b-b',c-c',d-d') (a,b,c,d) * (a',b',c',d') = (a*a',b*b',c*c',d*d') negate = lift4 negate negate negate negate abs = lift4 abs abs abs abs signum = lift4 signum signum signum signum instance (Fractional a, Fractional b, Fractional c, Fractional d) => Fractional (a,b,c,d) where fromRational x = (fromRational x, fromRational x, fromRational x, fromRational x) recip = lift4 recip recip recip recip instance (Floating a, Floating b, Floating c, Floating d) => Floating (a,b,c,d) where pi = (pi,pi,pi,pi) exp = lift4 exp exp exp exp log = lift4 log log log log sqrt = lift4 sqrt sqrt sqrt sqrt sin = lift4 sin sin sin sin cos = lift4 cos cos cos cos sinh = lift4 sinh sinh sinh sinh cosh = lift4 cosh cosh cosh cosh asin = lift4 asin asin asin asin acos = lift4 acos acos acos acos atan = lift4 atan atan atan atan asinh = lift4 asinh asinh asinh asinh acosh = lift4 acosh acosh acosh acosh atanh = lift4 atanh atanh atanh atanh {-------------------------------------------------------------------- Some experiments in Enum and Integral instances for tuples --------------------------------------------------------------------} {- -- Integral needs Enum instance (Enum a, Enum b, Bounded b) => Enum (a,b) where toEnum = noPair "toEnum" fromEnum = noPair "fromEnum" -- enumerate consistently with Ord enumFromTo (alo,blo) (ahi,bhi) = [ (alo,b) | b <- [blo .. maxBound] ] ++ [ (a ,b) | a <- [succ alo .. pred ahi], b <- [minBound .. maxBound] ] ++ [ (ahi,b) | b <- [minBound .. bhi] ] -- To do: replace enumFromTo def with an enumFromThenTo def -- deriving instance (Enum a, Enum b) => Enum (a,b) -- -- The data constructors of `(,)' are not all in scope -- so you cannot derive an instance for it -- To do: toEnum and fromEnum {- -- Test: data Foo = A | B | C | D deriving (Enum,Bounded,Show) t1 :: [(Foo,Foo)] t1 = [(B,C) .. (C,C)] -} instance (Real a, Real b) => Real (a,b) where toRational = noPair "toRational" instance (Integral a, Integral b, Bounded b) => Integral (a,b) where -- (a,b) `quotRem` (a',b') = ((qa,qb),(ra,rb)) -- where -- (qa,ra) = a `quotRem` a' -- (qb,rb) = b `quotRem` b' (a,b) `quotRem` (a',b') = transpose (a `quotRem` a' , b `quotRem` b') where transpose ((w,x),(y,z)) = ((w,y),(x,z)) -- to-do: pretty point-free toInteger (a , b::b) = toInteger a * widthB + toInteger b where widthB = toInteger (maxBound :: b) - toInteger (minBound :: b) {- t2 :: ((Int,Int),(Int,Int)) t2 = (7,8) `quotRem` (2,3) t3 :: (Int,Int) t3 = (7,8) `quot` (2,3) t4 :: (Int,Int) t4 = (7,8) `rem` (2,3) -} {- (a,b) `quot` (a',b') = (a `quot` a', b `quot` b') rem = liftA2 rem div = liftA2 div mod = liftA2 mod toInteger = noOv "toInteger" x `quotRem` y = (x `quot` y, x `rem` y) x `divMod` y = (x `div` y, x `mod` y) -} -} NumInstances-1.3/src/Data/NumInstances/Util.hs0000644000000000000000000000107012136055506017473 0ustar0000000000000000{-# OPTIONS_GHC -Wall -fno-warn-orphans #-} ---------------------------------------------------------------------- -- | -- Module : Data.NumInstances.Util -- Copyright : (c) Conal Elliott 2008 -- License : BSD3 -- -- Maintainer : conal@conal.net -- Stability : experimental -- -- Utilities for number class instances for functions and tuples ---------------------------------------------------------------------- module Data.NumInstances.Util (noOv) where noOv :: String -> String -> a noOv ty meth = error $ meth ++ ": No overloading for " ++ ty NumInstances-1.3/src-draconian-Num/0000755000000000000000000000000012136055506015435 5ustar0000000000000000NumInstances-1.3/src-draconian-Num/Data/0000755000000000000000000000000012136055506016306 5ustar0000000000000000NumInstances-1.3/src-draconian-Num/Data/NumInstances/0000755000000000000000000000000012136055506020715 5ustar0000000000000000NumInstances-1.3/src-draconian-Num/Data/NumInstances/PreRequisites.hs0000644000000000000000000000074212136055506024060 0ustar0000000000000000module Data.NumInstances.PreRequisites where import Control.Applicative import Data.NumInstances.Util noFun :: String -> a noFun = noOv "function" -- Eq & Show are prerequisites for Num, so they need to be faked here instance Eq (a->b) where (==) = noFun "(==)" (/=) = noFun "(/=)" instance Ord b => Ord (a->b) where min = liftA2 min max = liftA2 max instance Show (a->b) where show = noFun "show" showsPrec = noFun "showsPrec" showList = noFun "showList" NumInstances-1.3/src-relaxed-Num/0000755000000000000000000000000012136055506015123 5ustar0000000000000000NumInstances-1.3/src-relaxed-Num/Data/0000755000000000000000000000000012136055506015774 5ustar0000000000000000NumInstances-1.3/src-relaxed-Num/Data/NumInstances/0000755000000000000000000000000012136055506020403 5ustar0000000000000000NumInstances-1.3/src-relaxed-Num/Data/NumInstances/PreRequisites.hs0000644000000000000000000000010212136055506023534 0ustar0000000000000000module Data.NumInstances.PreRequisites where -- no prerequsites!