在Haskell中实现多项式乘法

在Haskell中实现多项式乘法,haskell,Haskell,我正在为多项式算术定义一些函数 为了便于调试,我列出了多项式列表: [5,3,7] -> 5 + 3*x + 7*x^2 这里我得到的函数add已经起作用了: add [1,9,7] [9,3] == [10,12,7] 但是我在mul方面有问题: mul [] _ = [0] mul (x : xs) ys = add (map (*x) ys) (mul (0 : xs) ys) mul [] _ = [0] mul (x : xs) ys = add

我正在为多项式算术定义一些函数

为了便于调试,我列出了多项式列表:

[5,3,7] -> 5 + 3*x + 7*x^2
这里我得到的函数
add
已经起作用了:

add [1,9,7] [9,3] == [10,12,7]
但是我在
mul
方面有问题:

mul []       _ = [0]
mul (x : xs) ys = add (map (*x) ys) (mul (0 : xs) ys)
mul []       _  = [0]
mul (x : xs) ys = add (map (*x) ys) (0 : (mul (xs) ys))
我想:

[4,5,6] * [1,2,3] = 4*[1,2,3] + [0,4,6]*[1,2,3]
计算mul[1][1,2,3]需要花费很长时间,我无法找出它有什么问题

mul []       _  = [0]
mul (x : xs) ys = add (map (*x) ys) (mul (0 : xs) ys)
让我们了解一下当您计算mul[1][1,2,3]时发生了什么:

mul (1:[]) [1,2,3]
-> add (map (*1) [1,2,3]) (mul (0:[]) [1,2,3])
-> add [1,2,3] (mul [0] [1,2,3])
-> add [1,2,3] (mul (0:[]) [1,2,3])
-> add [1,2,3] (add (map (*0) [1,2,3]) (mul (0:[]) [1,2,3]))
-> add [1,2,3] (add [0,0,0] (mul [0] [1,2,3]))
每次取出
,另一个
0
)就会附加到它上面,因此,您的第一个列表的长度(mul的第一个参数)永远不会改变

因此无法达到退出条件(
first\u list==[]

要修复它,请在
mul
之外附加
0

mul []       _ = [0]
mul (x : xs) ys = add (map (*x) ys) (mul (0 : xs) ys)
mul []       _  = [0]
mul (x : xs) ys = add (map (*x) ys) (0 : (mul (xs) ys))
或者这更接近你的直觉:

mul xs ys = if all (==0) xs
                then [0]
                else add (map (*(head xs)) ys) (0 : (mul (tail xs) ys))
让我们了解一下当您计算mul[1][1,2,3]时发生了什么:

mul (1:[]) [1,2,3]
-> add (map (*1) [1,2,3]) (mul (0:[]) [1,2,3])
-> add [1,2,3] (mul [0] [1,2,3])
-> add [1,2,3] (mul (0:[]) [1,2,3])
-> add [1,2,3] (add (map (*0) [1,2,3]) (mul (0:[]) [1,2,3]))
-> add [1,2,3] (add [0,0,0] (mul [0] [1,2,3]))
每次取出
,另一个
0
)就会附加到它上面,因此,您的第一个列表的长度(mul的第一个参数)永远不会改变

因此无法达到退出条件(
first\u list==[]

要修复它,请在
mul
之外附加
0

mul []       _ = [0]
mul (x : xs) ys = add (map (*x) ys) (mul (0 : xs) ys)
mul []       _  = [0]
mul (x : xs) ys = add (map (*x) ys) (0 : (mul (xs) ys))
或者这更接近你的直觉:

mul xs ys = if all (==0) xs
                then [0]
                else add (map (*(head xs)) ys) (0 : (mul (tail xs) ys))

当然,
xs==replicate(length xs)0
永远不应该实际使用
all(=0)xs
是正确的方法。@leftaroundabout谢谢,这比使用course
xs==replicate(length xs)0
要简单得多
all(=0)xs
是正确的方法。@leftaroundabout谢谢,宇宙所做的事情要整洁得多
(1+9x)+(9+3x)==(10+12x+7x^2)
?宇宙所做的事情
(1+9x)+(9+3x)==(10+12x+7x^2)