在Haskell中求解方程

时间:2011-08-29 18:45:23

标签: haskell functional-programming

我必须做一个练习而且我很丢失......我需要用多项式为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"

错误非常愚蠢,但是一小时试图解决它......有人可以帮助我吗?。

谢谢!

2 个答案:

答案 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是构造函数。