【问题标题】:How do the implementation of Eq typeclass function: x == y = not (x /= y) x /= y = not (x == y) work?Eq typeclass function: x == y = not (x /= y) x /= y = not (x == y) 的实现如何工作?
【发布时间】:2013-06-26 11:03:01
【问题描述】:

我在看book,里面讲了typeclass的定义Eq

Eq中有==/=两个函数,分别实现为:

  x == y = not (x /= y)  
  x /= y = not (x == y)  

书上说它们是相互递归的,函数的结果在另一个函数的项中。

我不明白的是,我在相互递归中没有看到基本情况,也不明白为什么函数会停止并返回结果。

【问题讨论】:

    标签: haskell recursion typeclass mutual-recursion


    【解决方案1】:

    有了这些定义,相互递归就不会停止——它会无限递归。这个想法是在实现 Eq 类型类时,用自己的基本情况覆盖两个定义之一。

    例如,如果您有一个 data Foo = Bar | Baz 类型,您的 Eq 实例可能如下所示:

    instance Eq Foo where
      Bar == Bar = True
      Baz == Baz = True
      _   == _   = False
    

    这里我们只定义了==,没有定义/=,所以/=将使用它的默认定义not (x == y)。但是我们对== 的定义不会回调/=,所以它不再相互递归,并且会毫无问题地终止。

    Eq==/= 提供默认实现的原因是,您可以决定是否要为==/= 提供定义,而您可以免费获得另一个即使你选择/=

    【讨论】:

    • 使用my proposal -- 希望在 GHC 的下一个版本中 -- 您可以以编译器可检查的方式指定类的最小完整定义,这样您就会收到警告如果你没有实现这两种方法。
    • @sepp2k 感谢您的解释。其实下面的书里有解释,但我没意识到它的存在……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多