Pixel
タイプをととしてColor
定義する画像処理モジュールを作成しましたLocation
。複数の画像間でピクセルを比較したい場合があるのでPixel
、、、Color
およびLocation
派生します。Eq
Eq
ピクセルを比較して、それらが完全に類似しているかどうかを確認するという私のニーズに合っています。これが私が望んでいたことです。インスタンス化の奇妙な副作用Eq
は、2つの異なるピクセルを同じまたはの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
私のaの定義Pixel
がこれらの比較に影響を与えたようですが、これは理解できることです。dLocation
は、比較に影響することを示しています。私が混乱しているのは、 aが、、、またはでなくてもb>=
と<=
bの両方であるということです。==
<
>
編集:誰かがこのコードのいずれかを使用したい場合に備えて、問題を修正するこのスニペットを含めます。必ず定義から削除Eq
してください。Pixel
instance Eq Pixel where
(Pixel _ a) == (Pixel _ b) = a == b
(Pixel _ a) /= (Pixel _ b) = a /= b
これにより、の比較Location
のみが可能になります。楽しみ!:)