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

Posted

技术标签:

【中文标题】为自己的数据类型定义 Ord 实例【英文标题】:Defining Ord instance for own datatype 【发布时间】:2014-07-06 12:56:32 【问题描述】:

作为 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】:

您可能正在寻找

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) 来解决这个问题。

【讨论】:

太棒了!没想到有这么简单的解决方案。是的,我考虑过这个问题,但我觉得必须编写一个函数,从末尾删除零。仍然:编译器声明没有我认为会自动生成的实例(Eq,Polynom) @Krismu 只需在数据类型声明后添加deriving (Show, Eq)

以上是关于为自己的数据类型定义 Ord 实例的主要内容,如果未能解决你的问题,请参考以下文章

预定义数据类型

C#编程(四十一)----------用户定义的数据类型转换

java引用数据类型(类)

结构体——定义,实例化,初始化

没有为“Firestore”类型定义吸气剂“实例”

JQuery DataTables 列自己定义数据类型排序