在haskell中写入多项式的数据类型

时间:2014-05-19 18:02:10

标签: haskell types polynomials

我要在haskell中为多项式写一个数据类型。

结果应该是这样的:

[] = 0:0         [1:0] = 1:0           [3; 2; 1; 0; 0] = x2 + 2x + 3
[0:0] = 0:0     [-5; 22] = 22x - 5         [5; 0; 3; 0; 1] = x4 + 3x2 + 5

我尝试声明一个多项式数据类型:

data Liste 
  = LeereListe 
  | Element a (List a)
  deriving (Show)

Polynom :: Liste Double
Polynom = Element 1 + (Element 2 * Element 2) + (Element 3 * Element 3 * Element 3)

我的错误:

4.hs:6:2: parse error on input `poly1'
:reload

4.hs:6:1:
    Invalid type signature: Polynom :: Liste Double
    Should be of form <variable> :: <type>

我不知道如何处理此错误。 我应该在代码中更改什么?

2 个答案:

答案 0 :(得分:3)

首先,a必须是数据类型中的变量,除非声明它,否则不能使用它。

data Liste a
  = LeereListe 
  | Element a (List a)
  deriving (Show)

其次,值必须以小写字母开头。由于您没有定义instance Num或任何便利函数,我们必须使用类型的构造函数在结构上创建值:

polynom :: Liste Double
polynom = Element 1 (Element 2 (Element 3 (Element 4 LeereListe)))

我想我可能会这样做,而不是定义一个新的结构:

newtype Polynomial = Polynomial [Double] deriving Show

evaluate :: Polynomial -> Double -> Double
evaluate (Polynomial coeff) x = sum $ zipWith (*) (iterate (x*) 1) coeff

答案 1 :(得分:1)

嘿原因列表已经定义我会使用这个定义:

data Polynom   = Polynom [(Double,Double)]
polyEval (Polynom []) a = 0
polyEval (Polynom (x:xs) ) a = (fst x) *a^(snd x) + polyEval (Polynom xs) a

所以你不需要存储所有系数。