我必须做一个练习而且我很丢失......我需要用多项式为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"
错误非常愚蠢,但是一小时试图解决它......有人可以帮助我吗?。
谢谢!
答案 0 :(得分: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)]
这也可以。
答案 1 :(得分:3)
我认为您希望在实例函数中使用P
而不是Pol
。 Pol是类型,P是构造函数。