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のみが可能になります。楽しみ!:)