numhask-0.0.1: src/NumHask/Algebra/Exponential.hs
{-# LANGUAGE ExtendedDefaultRules #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wall #-}
-- | Exponentail 'Ring' and 'Field'
module NumHask.Algebra.Exponential (
-- * Exponential
ExpRing(..)
, (^)
, ExpField(..)
) where
import qualified Protolude as P
import Protolude (Double, Float, Functor(..))
import Data.Functor.Rep
import NumHask.Algebra.Field
import NumHask.Algebra.Multiplicative
import NumHask.Algebra.Additive
import NumHask.Algebra.Ring
-- | ExpRing
class Ring a => ExpRing a where
logBase :: a -> a -> a
(**) :: a -> a -> a
-- | (^)
(^) :: ExpRing a => a -> a -> a
(^) = (**)
instance ExpRing Double where
logBase = P.logBase
(**) = (P.**)
instance ExpRing Float where
logBase = P.logBase
(**) = (P.**)
instance (Representable r, ExpRing a) => ExpRing (r a) where
logBase = liftR2 logBase
(**) = liftR2 (**)
-- | ExpField
class ( Field a
, ExpRing a ) =>
ExpField a where
sqrt :: a -> a
sqrt a = a**(one/(one+one))
exp :: a -> a
log :: a -> a
instance ExpField Double where
exp = P.exp
log = P.log
instance ExpField Float where
exp = P.exp
log = P.log
instance (Representable r, ExpField a) => ExpField (r a) where
exp = fmap exp
log = fmap log