我想创建一个Pixel类型,并使其成为Eq和Show类的实例。但是,我一直在阅读很多地方的信息,并且对此非常困惑。
以下是我需要创建的类型的一些信息:
我必须存储两个数字(像素的位置和0到255之间的值)。 如果它们具有相同的值,则两个像素是相等的,无论它们的位置如何。 对于Show实例,我需要打印位置和值。
这是我的尝试:
type position = Float
type greyScale = Int
type Pixel = (position, greyScale)
instance Eq Pixel where
greyScale == greyScale = True
instance Show Pixel where
show position = position
show greyScale = greyScale
这是一个正确的方法吗?
答案 0 :(得分:4)
类型名称必须以大写字母开头。因此,您的定义实际应该如下所示,因为您只定义了类型同义词:
type Position = Float
type GreyScale = Int
对于Pixel
:看起来您想要定义数据类型,而不仅仅是同义词,所以您应该这样做:
data Pixel = Pixel Position GreyScale
下一步:Eq
实例会比较两个Pixel
,因此您必须将其表示为:
instance Eq Pixel where
Pixel pos1 greyScale1 == Pixel pos2 greyScale2 = greyScale1 == greyScale2
greyScale1 == greyScale2
只是比较两个greyScales
,这就是你想要的。
此外,我不建议覆盖Show
个实例以确保read . show == id
成立。 (您可以通过在数据类型声明后添加deriving (Instance1, Instance2, ..)
来自动派生特定实例。我不会干涉它,而是定义不同的功能:
showPosition :: Pixel -> String
showPosition (Pixel position greyScale) = show position
和
showGreyscale :: Pixel -> String
showGreyscale (Pixel position greyScale) = show greyScale