【发布时间】:2017-03-24 13:55:32
【问题描述】:
我需要声明自己的类型类,但我不明白为什么会有 (==)。
data Egg = Soft | Hard
instance Eq Egg where
(==)
我没有找到在实例中使用 (==) 的任何内容,仅在类中使用
【问题讨论】:
标签: class haskell instance where typeclass
我需要声明自己的类型类,但我不明白为什么会有 (==)。
data Egg = Soft | Hard
instance Eq Egg where
(==)
我没有找到在实例中使用 (==) 的任何内容,仅在类中使用
【问题讨论】:
标签: class haskell instance where typeclass
拥有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 是一个讨论哪些字符用于运算符和函数的线程。
【讨论】:
我假设您正在尝试为您的自定义数据类型创建标准类型类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
正如你可以使用一个前缀形式的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)
【讨论】: