在Haskell中解方程

4

我需要做一个练习,但是我很迷茫...我需要用多项式实现 Ord 实例。这是我的尝试:

data Pol = P [(Float,Int)] deriving Show

instance Ord Pol where
  (Pol a) > (Pol b)  = (maxGrado a) > (maxGrado b) || ((maxGrado a) == (maxGrado b) && (maxCoe a) > (maxCoe b))
  (Pol a) < (Pol b)  = (maxGrado a) < (maxGrado b) || ((maxGrado a) == (maxGrado b) && (maxCoe a) < (maxCoe b))

maxGrado :: [(Float,Int)] -> Int
maxGrado [] = 0
maxGrado ((c,g):xs) = g  

maxCoe :: [(Float,Int)] -> Int
maxCoe [] = 0
maxcoe ((c,g):xs) = c

--错误:

ERROR file:.\Febrero 2011.hs:32 - Undefined data constructor "Pol"

错误非常愚蠢,但我已经花了一个小时来解决它...有人可以帮助我吗?非常感谢!

1
请不要踩票 - 这个问题绝对是合法的。 - fuz
在原本的形式中,这个问题无法回答,除非知道之前的帖子,这也让我遭受了一个负分,但我已经将其删除了。 - Random Dev
1
既然你说你“必须做一道练习题”,我就加上了“作业”标签。 - Michael Kohl
2个回答

9
data Pol = P [(Int, Int)]

在这个声明中,Pol 是类型构造器,P 是该数据类型的唯一数据构造器。通常,一个数据类型可以有多个数据构造器,因此我们需要进行区分。
一个简单的规则是,在谈论类型时应使用类型构造器,在谈论值时应使用数据构造器。
在这种情况下,您应该在实例头中使用Pol,但在函数模式中使用P
instance Ord Pol where
  (P a) > (P b)  = ...
  (P a) < (P b)  = ...

请注意类型构造器和数据构造器属于不同的命名空间,在同一上下文中不会同时使用。这意味着它们具有相同的名称是可以的。

data Pol = Pol [(Int, Int)]

这也可以起作用。

是的,你说得对,但现在它给了我这个错误:ERROR file:.\Febrero 2011.hs:30 - 无法构建超类实例 *** 实例:Ord Pol *** 提供的上下文:() *** 所需的超类:Eq Pol - Sierra
@user918139:EqOrd 的超类,这意味着您还必须拥有一个 Eq 实例。在这种情况下最简单的方法是告诉编译器为您派生它,就像您使用 Show 一样:data ... deriving (Eq, Show) - hammar

3
我认为你想在实例函数中使用P而不是Pol。Pol是类型,P是构造函数。

是的,你是对的,但现在它给我这个错误:ERROR file:.\Febrero 2011.hs:30 - 无法构建超类实例 *** 实例:Ord Pol *** 提供的上下文:() *** 所需的超类:Eq Pol - Sierra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接