我需要声明我自己的类型类,但我不明白为什么有(==)。Haskell自己的实例类型类
data Egg = Soft | Hard
instance Eq Egg where
(==)
我没有找到任何东西,其中(==)在一个实例中,只有一类
我需要声明我自己的类型类,但我不明白为什么有(==)。Haskell自己的实例类型类
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
作为一个快速提示:运营商是中缀(在术语之间),默认情况下,函数是前缀(在术语之前)。要制作一个运算符前缀,它被()
包围,为了实现函数中缀,它被``
包围。 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
正如你可以通过它环绕在括号,例如,(==) 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)
谢谢!我对前缀形式感到困惑 – Lorenzo
我是这么认为藏汉但他们已经写实例式蛋在哪里(==),我需要完成码。 (==)让我很困惑 – Lorenzo
你对运算符(==)感到困惑吗?我将编辑我的解决方案以显示前缀版本 –
我很笨,谢谢你的回答!完全忘了那是前缀 – Lorenzo