Я создал модуль обработки изображений, который определяет тип Pixel
как Color
и Location
. Pixel
, Color
и Location
производные Eq
, так как я могу захотеть сравнить пиксели между несколькими изображениями.
Eq
соответствует моим потребностям при сравнении пикселей, чтобы увидеть, действительно ли они похожи, что я и хотел. Странный побочный эффект экземпляра Eq
состоит в том, что сравнение двух непохожих пикселей с одинаковым Location
с <=
или >=
приводит к True
, но False
для ==
, <
и >
.
data Color = Color { red :: Int
, green :: Int
, blue :: Int
, alpha :: Int
} deriving ( Show, Eq )
data Location = Location { x :: Int
, y :: Int
} deriving ( Show, Eq, Ord )
data Pixel = Pixel { color :: Color
, location :: Location
} deriving ( Show, Eq )
instance Ord Pixel where
compare (Pixel _ a) (Pixel _ b) = compare a b
Затем в ghci некоторые тесты.
>let a = Pixel (Color 0 0 0 255) (Location 0 0)
>let b = Pixel (Color 0 0 1 255) (Location 0 0)
>let c = Pixel (Color 0 0 0 255) (Location 0 0)
>let d = Pixel (Color 0 0 0 255) (Location 0 1)
>a == b
False
>a /= b
True
>a < b
False
>a > b
False
>a <= b
True
>a >= b
True
>a == c
True
>a /= c
False
>a > c
False
>a < c
False
>a >= c
True
>a <= c
True
>a == d
False
>a /= d
True
>a > d
False
>a < d
True
a >= d
False
a <= d
True
Кажется, что мое определение Ord
для Pixel
повлияло на эти сравнения, что понятно. d показывает, что Location
влияет на сравнение. Часть, в которой я запутался, это то, как a является одновременно >=
и <=
b , не будучи ==
, <
или >
.
РЕДАКТИРОВАТЬ: Если кто-то захочет использовать любой из этого кода, я включу этот фрагмент, который устраняет проблему. Обязательно удалите Eq
из определения Pixel
.
instance Eq Pixel where
(Pixel _ a) == (Pixel _ b) = a == b
(Pixel _ a) /= (Pixel _ b) = a /= b
Это позволяет сравнивать только Location
. Наслаждайтесь! :)