Haskell Ord实例悖论在Eq

时间:2014-05-19 12:22:51

标签: haskell equality polynomials

我希望能够订购Polynomes,首先按长度(度)进行比较,然后按系数进行比较。多项式是具有[1,2,3] = 3x²+2x+1的双精度列表。 但是如果最后一个元素为零则应该删除它,所以我编写了一个名为realPolynom的函数。 realPolynom [1,2,3,0] = [1,2,3] 现在,我的Ord实例看起来像:

instance Ord Polynom where                                  
    compare a b = compare ((realLength a), reverse (pol2list (realPolynom a))) ((realLength b), reverse (pol2list (realPolynom b)))

realLength只是最后没有零的多项式的长度。

pLength :: Polynom -> Int       
pLength (Polynom(a)) = length a

realLength :: Polynom -> Int                        
realLength a = pLength(realPolynom(a))

pol2listPolynom p = p

pol2list :: Polynom -> [Double]
pol2list (Polynom p) = p 

问题是:

  • [0,2,0] < [0,2,3]是的,这很好

  • [0,2,0] < [0,2] false,也很好

  • [0,2,0] > [0,2] false,也很好

  • [0,2,0] == [0,2]假,这不好!应该是平等的!

3 个答案:

答案 0 :(得分:7)

您应该写

,而不是派生Eq
instance Eq Polynom where
  a == b = compare a b == EQ

答案 1 :(得分:4)

最好的解决方案可能是确保首先不会出现前导零。即而不是从列表中手动构建多项式,而是将它们提供给一个&#34;智能构造函数&#34;在打包Polynome数据类型之前吃掉零。

似乎有点像OO-ish的事情,但有时这种封装只是走的路,即使在函数式语言中也是如此。

答案 2 :(得分:0)

这样的事情应该有效:

instance Eq Polynom where
    x == y = pol2list (realPolynom x) == pol2list (realPolynom y)

不幸的是,在这种情况下,派生的Eq实例不是预期的实例。