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)
我需要声明我自己的类型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)