【问题标题】:define Eq instance -Haskell定义 Eq 实例 -Haskell
【发布时间】:2013-11-21 22:03:12
【问题描述】:

嘿, 我已经为自然数定义了一个数据结构,并且想定义一个Eq 实例,以查看两个数字是否相等,但我不断收到消息: “'Eq' 的出现模棱两可。它可以指 Main.eq 或 Prelude.eq” 你能告诉我,我可能做错了什么吗?

data Nat = Z | S Nat deriving Show

class Eq a where
  (==) :: a -> a -> Bool    

instance Eq Nat where
  Z == Z = True
  (S x) == (S y) = x == y
  x == y = False

非常感谢!

【问题讨论】:

  • 我确实认为您不应该定义自己的Eq,这样class Eq a where (==) :: a -> a -> Bool 就显得多余了

标签: haskell


【解决方案1】:

Haskell 的 Prelude(类似于标准库)定义了一个 Eq 类。您遇到的问题是 Haskell 不知道“Eq”是指您定义的类还是 Haskell 中内置的类。

考虑重命名您的班级。

有关 Haskell Prelude 及其 Eq 的更多信息在这里: http://hackage.haskell.org/package/base-4.6.0.1/docs/Prelude.html#t:Eq

【讨论】:

    【解决方案2】:

    您添加了一个名为Eq 的类的定义,这与Prelude 中的不同,编译器抱怨说当您编写instance Eq Nat 时它不知道您要实例化哪个类。

    您应该从您的代码中删除class Eq a where ... 的声明。

    【讨论】:

    • 或者import Prelude hiding (Eq)如果你真的想自己动手(但只是出于教育原因,没有理由在真实代码中这样做)。
    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多