module NumHask.Algebra.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
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 (**)
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