为自己的数据类型定义Ord实例

时间:2014-05-18 14:22:28

标签: haskell instance

对Haskell不熟悉我无法为我的数据类型实现一个Order实例, 即:

data Polynom = Polynom ([Double])
deriving Show   
p0 = Polynom([3.9,4.2,2.7])
p1 = Polynom([0.0,0.2,-3.6,9.4])

多面体是双打的列表,即p0 = 2.7x² + 4.2x + 3.9。我的问题是,我无法找出用于声明各种if-case的正确语法,从以下内容开始:

instance Ord Polynom where
realLength(a) > realLength(b) = a > b
       where if realLength(a)) == realLength(b) = compare lastElement(a) lastElement(b)

我知道这是一个非常糟糕的伪代码,但我希望你能得到这个想法。

我真的很感激任何关于如何开始的提示,我想我可以自己弄清楚不同的情况!

编辑: 图instance Eq可能是这样的,但编译器不接受它。

instance Eq Polynom where
(realPolynom a) == (realPolynom b) = (Polynom a) == (Polynom b)

realPolynom的代码:

realPolynom :: Polynom -> Polynom
realPolynom (Polynom(m:ns)) 
| m==0.0 = realPolynom (Polynom(ns))
| otherwise = Polynom(m:ns)

1 个答案:

答案 0 :(得分:3)

您可能正在寻找

instance Ord Polynom where
  compare (Polynom p) (Polynom q) = compare (length p, reverse p) (length q, reverse q)

首先按长度(度)比较多项式。当长度一致时,系数会被比较。

请注意,这假设多项式的第一个系数(列表中的最后一个)是非空的。也就是说,根据此排序,Polynomial [0,1,0]大于Polynomial [0,2]。您可能希望添加dropWhile (==0)来应对此问题。