【问题标题】:Haskell own instance typeclassHaskell 自己的实例类型类
【发布时间】:2017-03-24 13:55:32
【问题描述】:

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

data Egg = Soft | Hard

instance Eq Egg where
(==)

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

【问题讨论】:

    标签: class haskell instance where typeclass


    【解决方案1】:

    拥有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 Egg where (==),我需要完成代码。 (==) 让我非常困惑
    • 您是否对运算符 (==) 感到困惑?我将编辑我的解决方案以显示前缀版本
    • 我太笨了,谢谢你的回答!完全忘了那是个前缀
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2015-09-07
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多