Haskell 自己的实例类型类

Haskell own instance typeclass

我需要声明我自己的类型class但我不明白为什么会有 (==)。

data Egg = Soft | Hard

instance Eq Egg where
(==)

我没有找到在实例中使用 (==) 的任何内容,仅在 class

拥有 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

快速提醒:默认情况下,运算符是中缀(在术语之间),函数是前缀(在术语之前)。要使运算符前缀它被 () 包围,要使函数中缀它被 `` 包围。 Here 是一个讨论运算符与函数使用哪些字符的线程。

我假设您正在尝试为您的自定义数据类型创建标准类型classEq实例Eq class 定义为:

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

正如您可以 使用 前缀形式的 Haskell 运算符一样,将其括在括号中,例如 (==) 1 1,您也可以 实现前缀形式的运算符定义:

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)