【发布时间】:2011-04-23 19:26:12
【问题描述】:
我制作了一个图像处理模块,将Pixel 类型定义为Color 和Location。 Pixel、Color 和 Location 派生 Eq,因为我可能想比较多个图像之间的像素。
Eq 适合我比较像素以查看它们是否完全相同的需求,这正是我想要的。实例化 Eq 的一个奇怪副作用是,将具有相同 Location 的 2 个不同像素与 <= 或 >= 进行比较会得到 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
似乎我为Pixel 定义的Ord 影响了这些比较,这是可以理解的。 d 表明Location 影响比较。我感到困惑的部分是 a 如何既是 >= 又是 <= b 而不是 ==、< 或 >。
编辑:如果有人想使用此代码中的任何一个,我将包含此解决问题的 sn-p。请务必从 Pixel 定义中删除 Eq。
instance Eq Pixel where
(Pixel _ a) == (Pixel _ b) = a == b
(Pixel _ a) /= (Pixel _ b) = a /= b
这仅允许比较 Location。享受! :)
【问题讨论】:
-
值得注意的是,位置的 Ord 实例可以说在 2D 中没有合理的几何解释(默认的字典顺序偏向于水平分量)。也就是说,如果您想按位置索引 Data.Map,则需要一个 Ord 实例。同样,可以说颜色对于某些颜色模型只有合理的排序——例如。您可以根据其黑暗/明亮度订购 HSV 颜色。
标签: haskell comparison ghc typeclass deriving