在Haskell中输入参数

时间:2015-01-17 15:16:42

标签: haskell

我想创建一个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

这是一个正确的方法吗?

1 个答案:

答案 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