在Haskell中,我使用的是自定义数据类型Poly a = X | Coef a | Sum (Poly a) (Poly a) | Prod (Poly a) (Poly a) deriving (Show)
。
因此,多项式(3 + x)^ 2将表示为(Prod (Sum (Coef 3) X) (Sum (Coef 3) X))
。
我很难将以这种方式输入的多项式转换为其标准形式的系数列表,我相信这将是[9, 6, 1]
为(3 + x)^ 2 = 9 + 6x + x ^ 2。
我相信一个可能的解决方案是在我的多项式数据类型上实现一些数学函数,这样我就可以简化输入,但是我没有成功。还有另一种方式吗?
有人能指出我正确的方向吗?
答案 0 :(得分:6)
不要简化Poly
类型,直接简化为系数列表。也许反转系数列表(^0
的第一个元素,^1
的第二个元素,^2
的第三个元素等),我认为这样会更容易。
data Poly a = X | Coef a | Sum (Poly a) (Poly a) | Prod (Poly a) (Poly a) deriving (Show)
toList :: Num a => Poly a -> [a]
toList X = [0, 1]
toList (Coef a) = [a]
toList (Sum a b) = let a' = toList a …
toList (Prod a b) = let a' = toList a …
我将分别将a'
和b'
的列表Sum
和Prod
分别作为练习留下实际实现。
如果需要,您还可以创建一个toPoly :: [a] -> Poly a
函数,从列表转换为标准形式的多项式。