2015-01-17 178 views
1

我想創建一個Pixel類型,並使其成爲Eq和Show類的一個實例。但是,我一直在閱讀很多地方的信息,並對此感到困惑。Haskell中的類型參數

下面是關於類型的一些信息我需要創建:

我必須存儲兩個數字(像素的位置,從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

而對於更多的例子:[learnyouahaskell.com](http://learnyouahaskell.com/making-our-own-類型和 - 類型類) – phg

回答

4

類型名稱必須以大寫字母開頭。所以,你的定義,實際上應該是這樣的,因爲你只能定義類型的同義詞:

type Position = Float 
type GreyScale = Int 

對於Pixel:它看起來像你想定義的數據類型,而不是隻是一個代名詞,所以你應該這樣做這樣的:

data Pixel = Pixel Position GreyScale 

下一篇:Eq實例比較兩個Pixel S,所以你必須要代表他們這樣:

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