packages feed

NumInstances 1.0 → 1.2

raw patch · 5 files changed

+290/−165 lines, 5 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Data.NumInstances: instance (Floating a, Floating b) => Floating (a, b)
- Data.NumInstances: instance (Floating a, Floating b, Floating c) => Floating (a, b, c)
- Data.NumInstances: instance (Floating a, Floating b, Floating c, Floating d) => Floating (a, b, c, d)
- Data.NumInstances: instance (Fractional a, Fractional b) => Fractional (a, b)
- Data.NumInstances: instance (Fractional a, Fractional b, Fractional c) => Fractional (a, b, c)
- Data.NumInstances: instance (Fractional a, Fractional b, Fractional c, Fractional d) => Fractional (a, b, c, d)
- Data.NumInstances: instance (Num a, Num b) => Num (a, b)
- Data.NumInstances: instance (Num a, Num b, Num c) => Num (a, b, c)
- Data.NumInstances: instance (Num a, Num b, Num c, Num d) => Num (a, b, c, d)
- Data.NumInstances: instance Eq (a -> b)
- Data.NumInstances: instance Floating b => Floating (a -> b)
- Data.NumInstances: instance Fractional b => Fractional (a -> b)
- Data.NumInstances: instance Num b => Num (a -> b)
- Data.NumInstances: instance Ord b => Ord (a -> b)
- Data.NumInstances: instance Show (a -> b)
+ Data.NumInstances.Function: instance Eq (a -> b)
+ Data.NumInstances.Function: instance Floating b => Floating (a -> b)
+ Data.NumInstances.Function: instance Fractional b => Fractional (a -> b)
+ Data.NumInstances.Function: instance Num b => Num (a -> b)
+ Data.NumInstances.Function: instance Ord b => Ord (a -> b)
+ Data.NumInstances.Function: instance Show (a -> b)
+ Data.NumInstances.Tuple: instance (Floating a, Floating b) => Floating (a, b)
+ Data.NumInstances.Tuple: instance (Floating a, Floating b, Floating c) => Floating (a, b, c)
+ Data.NumInstances.Tuple: instance (Floating a, Floating b, Floating c, Floating d) => Floating (a, b, c, d)
+ Data.NumInstances.Tuple: instance (Fractional a, Fractional b) => Fractional (a, b)
+ Data.NumInstances.Tuple: instance (Fractional a, Fractional b, Fractional c) => Fractional (a, b, c)
+ Data.NumInstances.Tuple: instance (Fractional a, Fractional b, Fractional c, Fractional d) => Fractional (a, b, c, d)
+ Data.NumInstances.Tuple: instance (Num a, Num b) => Num (a, b)
+ Data.NumInstances.Tuple: instance (Num a, Num b, Num c) => Num (a, b, c)
+ Data.NumInstances.Tuple: instance (Num a, Num b, Num c, Num d) => Num (a, b, c, d)

Files

NumInstances.cabal view
@@ -1,6 +1,10 @@ Name:                NumInstances-Version:             1.0+Version:             1.2 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@@ -12,8 +16,10 @@  Library   hs-Source-Dirs:      src-  Exposed-modules:     Data.NumInstances+  Exposed-modules:     Data.NumInstances, Data.NumInstances.Function, Data.NumInstances.Tuple   Build-Depends:       base<5-  -- Other-modules:       -  +  Other-modules:       Data.NumInstances.Util+ -- This module used to be part of vector-space++ ghc-prof-options:    -prof -auto-all 
src/Data/NumInstances.hs view
@@ -1,9 +1,8 @@-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}-{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# OPTIONS_GHC -Wall -fno-warn-orphans #-} ---------------------------------------------------------------------- -- | -- Module      :  Data.NumInstances--- Copyright   :  (c) Conal Elliott 2008+-- Copyright   :  (c) Conal Elliott 2008-2013 -- License     :  BSD3 --  -- Maintainer  :  conal@conal.net@@ -14,161 +13,5 @@  module Data.NumInstances () where -import Control.Applicative--noOv :: String -> String -> a-noOv ty meth = error $ meth ++ ": No overloading for " ++ ty--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"--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-------- Tuples--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+import Data.NumInstances.Function ()+import Data.NumInstances.Tuple ()
+ src/Data/NumInstances/Function.hs view
@@ -0,0 +1,63 @@+{-# 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.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"++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
+ src/Data/NumInstances/Tuple.hs view
@@ -0,0 +1,196 @@+{-# 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)+-}++-}
+ src/Data/NumInstances/Util.hs view
@@ -0,0 +1,17 @@+{-# 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