繁体   English   中英

公式上的Haskell Ord实例悖论

[英]Haskell Ord instance paradox on Eq

我希望能够对多项式进行排序,并首先按长度(度)进行比较,然后按系数进行比较。 多项式是[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只是最后没有零的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]错误,也不错

  • [0,2,0] > [0,2]错误,也不错

  • [0,2,0] == [0,2]假,这不好! 应该相等!

而不是推导Eq,您可能应该写

instance Eq Polynom where
  a == b = compare a b == EQ

最好的解决方案可能是确保一开始就不会出现前导零。 即,您无需将其手动从列表中构建多项式,而是将其提供给“智能构造函数”,该Polynome在打包Polynome数据类型之前会吃掉零。

看起来有些OO式的事情要做,但是有时这种封装只是路要走,即使在功能语言中也是如此。

这样的事情应该起作用:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM