ado*_*ppy 3 comparison haskell typeclass ghc deriving
我已经制作了一个图像处理模块,将模型定义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
Run Code Online (Sandbox Code Playgroud)
然后在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
Run Code Online (Sandbox Code Playgroud)
似乎我Ord对a的定义Pixel影响了这些比较,这是可以理解的.d表示Location影响比较.我感到困惑的部分是如何一个既>=和<= b而不被==,<或>.
编辑:如果有人想使用任何此代码,我将包括解决问题的代码片段.请务必Eq从Pixel定义中删除.
instance Eq Pixel where
(Pixel _ a) == (Pixel _ b) = a == b
(Pixel _ a) /= (Pixel _ b) = a /= b
Run Code Online (Sandbox Code Playgroud)
这允许Location仅进行比较.请享用!:)
我感到困惑的部分是如何
a大于或等于,小于或等于b不等于,小于或等于.
通过引入您的自定义Ord实例Pixel,在继续推导的同时
Eq,您会得到一个有趣的结果:
这会使事情表现得很奇怪,因为有些东西会比较
EQ(基于只有相同的位置),而同时,如果你测试相等(==),那么值将是不相等的,因为颜色也包括在内.
基本上你已经使实例Eq和Ord实例不健全.
无论是获得两Eq和Ord,快满构造平等顺序,或者手动编写的Eq,它放弃色彩信息,如您现有实例Ord的实例一样.