> {-# LANGUAGE GADTs #-} Metric spaces defined over arbitrary sets. > module Data.Metric.Set ( > Discrete(..) > ) where > > import Control.Applicative.Extras ((<$$>)) > import Data.Metric.Class (Metric(..)) `Discrete` wraps the discrete metric. If to elements are equal, the distance is 0, otherwise it is 1. This can be applied between any two `Eq` instances; i.e. any pair of non-empty sets. > data Discrete a where > Discrete :: Eq a => a -> Discrete a > > instance Metric (Discrete a) where > Discrete a <-> Discrete b > | a == b = 0 > | otherwise = 1 > > instance Eq (Discrete a) where > (==) = (0==) <$$> distance > > instance Show a => Show (Discrete a) where > show (Discrete a) = "Discrete " ++ show a