[英]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.