簡體   English   中英

為新類型創建實例

[英]Creating an instance for a new type

我在Haskell中創建了一個代表像素的類型,如下所示:

data Pixel = Pixel Float Float Int deriving (Eq, Show)

在這里,第一個浮點數對應於像素在x軸上的位置,第二個浮點數代表在y軸上的位置(因此基本上我在“屏幕”上具有2個坐標),並且Int是其灰度值。

我想創造和實例EqPixel ,其中像素是彼此相等,如果它們的灰度值是相同的,而不管其位置的。

到目前為止,我已經做到了:

instance Eq Pixel where

但是現在我不知道如何檢查它們是否相同,我的意思是,我怎么說我在這里有2個不同的Pixels,我想比較它們的Int 我不能做這樣的事情

grey1 == grey2 = True

因為我不知道grey1grey2來源。

我該怎么做?

另外,在為Show創建實例時,如何引用浮點數和整數?

像這樣嗎

data Pixel = Pixel Float Float Int

instance Eq Pixel where 
    Pixel _ _ g1 == Pixel _ _ g2 = g1 == g2

instance Show Pixel where
    show ( Pixel  x y g ) = "Pixel " ++ show g ++ " at ("  ++ show x ++ "," ++ show y ++ ")"

請改用記錄語法

data Pixel = Pixel {   xPos :: Float
                     , yPos :: Float
                     , value :: Int  
                     }

xPosyPosvalue具有類型Pixel -> FloatPixel -> Int ,這將使某些操作比模式匹配更容易。

但是,使其成為適當類的實例就足夠了(示例):

instance Show Pixel where
    show (Pixel x y g) = "[" ++ show x ++ ", " ++ show y ++ "(" ++ show g ++ ")]"

instance Eq Pixel where
    (Pixel _ _ valA) == (Pixel _ _ valB) = valA == valB

與實際使用的記錄語法相同:

instance Show Pixel where
    show pixel = "[" ++ show (xPos pixel) ++ ", " ++ show (yPos pixel) ++ "(" ++ show (value pixel) ++ ")]"

instance Eq Pixel where
    a == b = (value a) == (value b)

您可能需要修改示例。 它們僅用於說明目的。

您要做的是在Pixel的構造函數上進行模式匹配 這就是您編寫“拆分”類型的函數的方式。 模式匹配使用case語句進行

case pixel of
  Pixel x y grey -> ...

作為語法糖,也可以直接在定義中使用

getX :: Pixel -> Double
getX (Pixel x y grey) = x

-- same as

getX :: Pixel -> Double
getX px = case px of
  Pixel x y grey -> x

所以我們要做兩次以創建一個相等函數

instance Eq Pixel where
  Pixel x1 y1 grey1 == Pixel x2 y2 grey2 = grey1 == grey2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM