>
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