2011-08-29 50 views
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:

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

的错误是非常愚蠢的,但it's了一个小时试图解决它...谁能帮助我?

谢谢!

+1

请不要低估 - 这个问题是绝对合法的。原来的形式 – fuz

+0

这个问题是不负责任的,不知道老帖子也让我反感 - 但是我把它删除了一切 – Carsten

+1

既然你说你“必须做一个练习”,我添加了“家庭作业”标签。 –

回答

3

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

+0

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

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)] 

这也行得通。

+0

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

+0

@ user918139:'Eq'是'Ord'的超类,所以这意味着您还必须有一个'Eq'实例。在这种情况下,最简单的事情就是告诉编译器为你派生它,就像你使用'Show':'data ...派生(Eq,Show)'所做的一样。 – hammar

+0

太棒了,它的工作原理。非常感谢!! – Sierra