{-# OPTIONS -fglasgow-exts #-} module Fuzzy(Fuzzy, Teps5, Teps10, Teps15, Tsub1, Fuzz) where newtype Fuzzy d a = F a deriving (Num, Fractional, Floating, Real, RealFrac, Show, Read) class Fuzz d a {- | d -> a -} where eps :: d -> a data Teps5 data Teps10 data Teps15 data Tsub1 a instance (Fractional a, Fuzz d a) => Fuzz (Tsub1 d) a where eps x = eps x / 10 instance (Fractional a) => Fuzz Teps5 a where eps _ = 1e-5 instance (Fractional a) => Fuzz Teps10 a where eps _ = 1e-5 instance (Fractional a) => Fuzz Teps15 a where eps _ = 1e-15 fuzzyEq :: (Fuzz d a, Ord a, Num a) => Fuzzy d a -> Fuzzy d a -> Bool fuzzyEq fx@(F x) (F y) = abs (x - y) < eps (dOf fx) where dOf :: Fuzzy d a -> d dOf _ = undefined instance (Fuzz d a, Ord a, Num a) => Eq (Fuzzy d a) where x == y = fuzzyEq x y {- fuzzyCmp :: (Fuzz d, Ord a) => Fuzzy d a -> Fuzzy d a -> Ordering fuzzyCmp fx@(F x) (F y) = abs (x - y) `compare` eps (dOf fx) where dOf :: Fuzzy d a -> d dOf _ = undefined -} {- instance (Fuzz d, Ord a) => Ord (Fuzzy d a) where x `compare` y = x `fuzzyCmp` y -}