簡體   English   中英

Haskell自己的實例類型類

[英]Haskell own instance typeclass

我需要聲明自己的類型類,但我不明白為什么會有(==)。

data Egg = Soft | Hard

instance Eq Egg where
(==)

我沒有發現在實例中使用(==)的任何東西,僅在類中

擁有一個Eq實例的簡單方法是:

data Egg = Soft | Hard deriving Eq

困難的方法(具有更多控制權):

data Egg = Soft | Hard

instance Eq Egg where
  Soft == Soft = True
  Hard == Hard = True
  _    == _    = False

UPD :由於相等函數(==)作為運算符似乎是令人困惑的位,因此以下是用前綴符號編寫的同一實例:

data Egg = Soft | Hard

instance Eq Egg where
  (==) Soft Soft = True
  (==) Hard Hard = True
  (==) _    _    = False

快速提醒一下:默認情況下,運算符為infix(在術語之間),默認情況下,函數為prefix(在術語之前)。 要使運算符成為前綴,將其用()包圍,將其作為函數綴以`` 是一個討論用於運算符與函數的字符的線程。

我假設您正在嘗試為您的自定義數據類型創建標准類型類Eq實例 Eq類定義為:

class Eq a where

  (==) :: a -> a -> Bool
  a == b = not (a /= b)

  (/=) :: a -> a -> Bool
  a /= b = not (a == b)

也就是說,它定義了兩個方法==/= (碰巧是運算符),並提供了每個方法的默認實現。 因此,要為您自己的類型創建一個Eq實例,您需要為您的類型提供一個或兩個功能( ==/= )的實現。 請注意, instance的主體必須縮進。

instance Eq Egg where
  Soft == Soft = True
  Hard == Hard = True
  _ == _ = False

正如您可以通過將其包裝在括號中(例如(==) 1 1以前綴形式使用 Haskell運算符一樣,您也可以以前綴形式實現運算符定義:

instance Eq Egg where
  (==) Soft Soft = True
  (==) Hard Hard = True
  (==) _ _ = False

如果需要,您甚至可以使用一個case

instance Eq Egg where
  (==) a b = case (a, b) of
    (Soft, Soft) -> True
    (Hard, Hard) -> True
    _ -> False

請注意,這些都與通過deriving為您自動生成的實例相同:

data Egg = Soft | Hard
  deriving (Eq)

暫無
暫無

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

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