{-# LANGUAGE CPP #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeOperators #-}
module Data.Semifield (
type SemifieldLaw, Semifield
, anan, pinf
, (/), (\\), (^^)
, recip
, type FieldLaw, Field, Real
, ninf
) where
import safe Data.Complex
import safe Data.Fixed
import safe Data.Semiring
import safe Data.Semigroup.Additive
import safe GHC.Real hiding (Real, Fractional(..), (^^), (^), div)
import safe Numeric.Natural
import safe Foreign.C.Types (CFloat(..),CDouble(..))
import Prelude (Monoid(..) , Float, Double)
type SemifieldLaw a = ((Additive-Monoid) a, (Multiplicative-Group) a)
class (Semiring a, SemifieldLaw a) => Semifield a
anan :: Semifield a => a
anan = zero / zero
{-# INLINE anan #-}
pinf :: Semifield a => a
pinf = one / zero
{-# INLINE pinf #-}
type FieldLaw a = ((Additive-Group) a, (Multiplicative-Group) a)
class (Ring a, Semifield a, FieldLaw a) => Field a
class Field a => Real a
ninf :: Field a => a
ninf = negate one / zero
{-# INLINE ninf #-}
instance Semifield ()
instance Semifield (Ratio Natural)
instance Semifield Rational
instance Semifield Uni
instance Semifield Deci
instance Semifield Centi
instance Semifield Milli
instance Semifield Micro
instance Semifield Nano
instance Semifield Pico
instance Semifield Float
instance Semifield Double
instance Semifield CFloat
instance Semifield CDouble
instance Field a => Semifield (Complex a)
instance Field ()
instance Field Rational
instance Field Uni
instance Field Deci
instance Field Centi
instance Field Milli
instance Field Micro
instance Field Nano
instance Field Pico
instance Field Float
instance Field Double
instance Field CFloat
instance Field CDouble
instance Field a => Field (Complex a)
instance Real Rational
instance Real Uni
instance Real Deci
instance Real Centi
instance Real Milli
instance Real Micro
instance Real Nano
instance Real Pico
instance Real Float
instance Real Double
instance Real CFloat
instance Real CDouble