3

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

4

2 に答える 2

9

私が混乱している部分は、等しい、より小さい、またはより大きいのではなく、どのようaにより大きいか等しいか、またはより小さいか等しいかです。b

のカスタムOrdインスタンスを導入することで、Pixelを導出しながら Eq、興味深い結果が得られます。

  • ピクセルは、色と位置の両方に基づいて、完全に構造的に等しい
  • ただし、順序を指定するには、色を無視するように依頼します。

これは物事を奇妙に振る舞わせます. EQ(同じ場所のみを持つことに基づいて)と比較するもの(==)もあります. .

基本的に、EqandOrdインスタンスを不健全にしました。

Eqと の両方を導出して完全な構造的等価性と順序付けを取得するか、既存のインスタンスのように色情報を破棄するインスタンスをOrd手動で記述します。EqOrd

于 2011-04-23T19:39:22.050 に答える
3

Ord インスタンスは色を無視しますが、派生した Eq インスタンスは無視しないためです。 はEq 型クラスのメソッドであり、派生メソッドは色を考慮するため、 a == b false です。はOrd 型クラスの一部であり、compare の実装は色を無視するため、true です。 ==
a <= b <= compare a b == EQ

于 2011-04-23T19:34:15.613 に答える