module UniqueLogic.ST.TF.ZeroFractional (
C, multiply, divide,
multiplyDefault, divideDefault,
) where
import Data.Complex (Complex, )
import Data.Ratio (Ratio, )
import Data.Maybe.HT (toMaybe, )
class Fractional a => C a where
multiply :: a -> Maybe a
divide :: a -> a -> Maybe a
instance C Float where
multiply = multiplyDefault
divide = divideDefault
instance C Double where
multiply = multiplyDefault
divide = divideDefault
instance (Integral a) => C (Ratio a) where
multiply = multiplyDefault
divide = divideDefault
instance (RealFloat a) => C (Complex a) where
multiply = multiplyDefault
divide = divideDefault
multiplyDefault :: (Num a, Eq a) => a -> Maybe a
multiplyDefault x = toMaybe (x==0) 0
divideDefault :: (Fractional a, Eq a) => a -> a -> Maybe a
divideDefault z x = toMaybe (z/=0 || x/=0) (z/x)