我定义了多项式算术的一些函数
为了便于调试,我创建了多项式列表:
[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)
正如我想的那样:
[4,5,6] * [1,2,3] = 4*[1,2,3] + [0,4,6]*[1,2,3]
评估mul [1] [1,2,3]
需要永远,我无法找出它的错误。
答案 0 :(得分:4)
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]))
每次取出head
时,都会附加另一个head
(0
),因此,第一个列表的长度(mul
的第一个参数)永远不会改变。
因此无法达到退出条件(first_list == []
)。
要解决此问题,请在0
之外追加mul
:
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))