是什么原因导致Haskell中的复数Ord实例出现此错误?
我正在尝试在Haskell中实现复数的Ord实例。我遵循了我在网上找到的实现Ord实例的格式,但是我得到了一个我不理解的错误。以下是我的实例代码:是什么原因导致Haskell中的复数Ord实例出现此错误?,haskell,compare,Haskell,Compare,我正在尝试在Haskell中实现复数的Ord实例。我遵循了我在网上找到的实现Ord实例的格式,但是我得到了一个我不理解的错误。以下是我的实例代码: instance Ord Complex where compare (Com x1 y1) (Com x2 y2) | (sqrt ((x1^2)+(y1^2))) < (sqrt ((x2^2)+(y2^2)) = -1 | (sqrt ((x1^2)+(y1^2))) == (sqrt ((x2^2)+(y2^2)) = 0
instance Ord Complex where
compare (Com x1 y1) (Com x2 y2)
| (sqrt ((x1^2)+(y1^2))) < (sqrt ((x2^2)+(y2^2)) = -1
| (sqrt ((x1^2)+(y1^2))) == (sqrt ((x2^2)+(y2^2)) = 0
| otherwise = 1
但是我看到的所有Ord实例都使用相同的格式。这是什么错误?两个子句中的括号都不平衡。两个子句中都缺少一个不平衡的括号。您缺少一个接近的参数。您的代码存在多个问题
Ord
实例。您试图定义的一个会产生非常违反直觉的结果,如-2>-1
。一个更合理的实例只是比较真实的部分,但如果它们相等,这是有问题的。总之,这是一个您最好不要定义的实例
- 在一个不等式的两边取一个值(如
所保证的值为正值)没有区别(^2)
好的,在这一点上,编译器抱怨的问题是很明显的:缺少两个结束参数。或者更确切地说,你有太多的开始参数,因为这些都不是实际需要的(compare (Com x1 y1) (Com x2 y2) | ((x1^2)+(y1^2)) < ((x2^2)+(y2^2) = -1 | ((x1^2)+(y1^2)) == ((x2^2)+(y2^2) = 0
绑定甚至比infix 4==
弱) 但是这些防护措施非常标准,您不需要将它们写出来:只需在+
值上再次调用r
(已经定义的compare
实例):Double
您现在还可以再次内联变量:compare (Com x₁ y₁) (Com x₂ y₂) = compare r₁ r₂ where r₁ = x₁^2 + y₁^2 r₂ = x₂^2 + y₂^2
compare (Com x₁ y₁) (Com x₂ y₂) = compare (x₁^2 + y₁^2) (x₂^2 + y₂^2)
- 有很好的理由不给复数一个
实例。你试图定义的一个实例给出了非常违反直觉的结果,如Ord
。一个更合理的实例只会比较真实的部分,但如果它们相等,那就有问题了。-2>-1
总之,这是一个实例,你最好不要这样做没有定义 - 你的条款太复杂了
- 在一个不等式的两边取一个值(如
所保证的值为正值)没有区别(^2)
好的,在这一点上,编译器抱怨的问题是很明显的:缺少两个结束参数。或者更确切地说,你有太多的开始参数,因为这些都不是实际需要的(compare (Com x1 y1) (Com x2 y2) | ((x1^2)+(y1^2)) < ((x2^2)+(y2^2) = -1 | ((x1^2)+(y1^2)) == ((x2^2)+(y2^2) = 0
绑定甚至比infix 4==
弱) 但是这些防护措施非常标准,您不需要将它们写出来:只需在+
值上再次调用r
(已经定义的compare
实例):Double
您现在还可以再次内联变量:compare (Com x₁ y₁) (Com x₂ y₂) = compare r₁ r₂ where r₁ = x₁^2 + y₁^2 r₂ = x₂^2 + y₂^2
compare (Com x₁ y₁) (Com x₂ y₂) = compare (x₁^2 + y₁^2) (x₂^2 + y₂^2)
结果应该是
,LT
,EQ
,不?@LouisWasserman最好是:GT
结果应该是实例Ord复合体,其中比较=比较(\(Com x y)->x^2+y^2)
,LT
,EQ
,不是吗?@LouisWasserman最好是:GT
只是为了放大第1点,所有Ord实例都应该遵循一些规律。其中之一是(compare x y==EQ)意味着(x==y),这是你的定义不遵守的。为了进一步说明第1点,所有Ord实例都应该遵循一些定律。其中之一是(compare x y==EQ)暗示(x==y),你的定义不遵守这些定律。实例Ord复合体,其中compare=comparing(\(Com x y)->x^2+y^2)
compare (Com x₁ y₁) (Com x₂ y₂) = compare r₁ r₂ where r₁ = x₁^2 + y₁^2 r₂ = x₂^2 + y₂^2
compare (Com x₁ y₁) (Com x₂ y₂) = compare (x₁^2 + y₁^2) (x₂^2 + y₂^2)
- 在一个不等式的两边取一个值(如
您的代码存在多个问题