
I think you are trying to solve a problem that doesn't exist. * Float and Double are imprecise types by their very nature. That's exactly what people are forgetting, and exactly what's causing misunderstandings. Perhaps(!) it would be better to remove the option to use rational literals as floats, and require people to convert rationals using approx :: (Approximates b a) => a -> b when they want to use FP math (instance Approximates Float Rational, etc). * Pure equality tests make perfect sense in a few situations, so Eq is required. In fact, it's required to have an IEEE754-compliant implementation. * As mentioned, there is a total order (Ord) on floats (which is what you should be using when checking whether two approximations are approximately equal), which implies that there is also an equivalence relation (Eq).