有些戒指可以配备标准功能:
class (Ring.C a) => EuclideanDomain a where
norm :: a -> Integer
使用此功能,可以通过明显的方式订购戒指:
compare x y = compare (norm x) (norm y)
但我不确定如何表明这一点。我尝试做
instance (EuclideanDomain a, Eq a) => Ord a where
但这给了我一些警告,当我启用相关的编译器标志时,它告诉我“约束不小于实例头” - 如果我启用 UndecidableInstances 一切都会陷入困境。
有办法做我想做的事吗?
哈马尔已经提供了解决方案;我想指出这个例子的另一个问题。你想要表达的是“每当一个类型是一个实例Eq
and EuclideanDomain
,使用这个规则来创建一个实例Ord
” 但这在 Haskell 中是无法表达的。这一行
instance (EuclideanDomain a, Eq a) => Ord a where
实际上的意思是,“使用这个规则来制作一个Ord
任何类型的实例。如果实例是错误的EuclideanDomain
and Eq
不在范围内”。这不好,因为此规则将与所有其他 Ord 实例重叠。
基本上任何时候你想写一个实例Class typevar
,你将需要一个新类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)