Class 定义自己的实例类

Class 定义自己的实例类,class,haskell,instance,Class,Haskell,Instance,我很难为我的数据类型创建自己的实例。 我定义了如下类型: data早餐=鸡蛋|香肠Int |面包早餐衍生(Eq,Show) 并希望它是Ord类的一个实例。我想用一些规则来比较,比如:一个鸡蛋相当于两条香肠等等 我这样试过: instance Ord a => Ord (Breakfast) where compare (Egg) (Sausage 2) = EQ ... 但我得到了一个错误: 变量a的出现频率高于实例头。 我尝试了另一个例子,效果很好: data Down a =

我很难为我的数据类型创建自己的实例。 我定义了如下类型:

data早餐=鸡蛋|香肠Int |面包早餐衍生(Eq,Show)

并希望它是Ord类的一个实例。我想用一些规则来比较,比如:一个鸡蛋相当于两条香肠等等

我这样试过:

instance Ord a => Ord (Breakfast) where
 compare (Egg) (Sausage 2) = EQ 
 ...
但我得到了一个错误: 变量
a
的出现频率高于实例头。 我尝试了另一个例子,效果很好:

data Down a = Down a deriving (Eq, Show, Read)

instance Ord a => Ord (Down a) where
 compare (Down x) (Down y) = y `compare` x

希望你们能帮我解决问题。我对哈斯克尔很陌生。谢谢

只需删除实例定义上的约束:

instance Ord Breakfast where
  compare (Egg) (Sausage 2) = EQ 
  ...

您对一个类型变量
a
有一个约束,该变量未在右侧(实例头)使用。

只需删除实例定义上的约束:

instance Ord Breakfast where
  compare (Egg) (Sausage 2) = EQ 
  ...

您对一个类型变量
a
有一个约束,该变量未在右侧(实例头)使用。

ok它可以工作。非常感谢。但是我认为如果一个类已经存在,并且您希望自己的类型成为typeclass的一部分,那么您必须这样做?当您需要对某些类型变量实施一些约束时,您必须这样做。例如,在您的
Ord(Down a)
实例中,如果您没有约束
Ord a
,您将无法使用
compare x y
,因为
x
y
属于
a
类型。谢谢。现在它有意义了。最后一个问题是否适合你。我有
compare(Egg)(香肠2)=EQ
,这很好,现在我想要另一个模式,比如
compare(香肠3)(Egg)=GT
,它在第二个“=”上得到一个解析错误。你知道为什么吗?不应该。检查缩进,你是对的。只是个账单什么的。非常感谢你!真的很感谢你的帮助好的。非常感谢。但是我认为如果一个类已经存在,并且您希望自己的类型成为typeclass的一部分,那么您必须这样做?当您需要对某些类型变量实施一些约束时,您必须这样做。例如,在您的
Ord(Down a)
实例中,如果您没有约束
Ord a
,您将无法使用
compare x y
,因为
x
y
属于
a
类型。谢谢。现在它有意义了。最后一个问题是否适合你。我有
compare(Egg)(香肠2)=EQ
,这很好,现在我想要另一个模式,比如
compare(香肠3)(Egg)=GT
,它在第二个“=”上得到一个解析错误。你知道为什么吗?不应该。检查缩进,你是对的。只是个账单什么的。非常感谢你!非常感谢你的帮助