2017-03-24 232 views
1

我需要声明我自己的类型类,但我不明白为什么有(==)。Haskell自己的实例类型类

data Egg = Soft | Hard 

instance Eq Egg where 
(==) 

我没有找到任何东西,其中(==)在一个实例中,只有一类

回答

4

最省事的方法有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是一个讨论哪些字符用于运算符与函数的线程。

+0

我是这么认为藏汉但他们已经写实例式蛋在哪里(==),我需要完成码。 (==)让我很困惑 – Lorenzo

+0

你对运算符(==)感到困惑吗?我将编辑我的解决方案以显示前缀版本 –

+0

我很笨,谢谢你的回答!完全忘了那是前缀 – Lorenzo

1

我假设您正在尝试为您的自定义数据类型制作标准类型类别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) 
+0

谢谢!我对前缀形式感到困惑 – Lorenzo

相关问题