我有两个包含两个不同多项式系数的列表,我希望编写一个可以将它们相乘的函数(即F-O-I-L)。
我写的函数不完整,但我只是用它来测试我对它应该如何工作的理解。
fun polyMult(nil, nil) = nil
| polyMult(M as x::xs, N as y::ys) =
(x * y)::polyMult(xs, ys);
我是在正确的轨道上吗?
另外,我收到一条错误消息,指出uncaught exception Match [nonexhaustive match failure]
这是什么意思?
答案 0 :(得分:2)
不幸的是,你没有走上正轨。你的函数只是用乘法来压缩两个列表,这不是F-O-I-L的工作方式。通过定义多项式乘法,您的函数应该返回更高程度的多项式。 This应该有助于您理解F-O-I-L。
非穷举匹配错误意味着您没有涵盖模式匹配中两个列表的所有可能情况。事实上,你错过了两个案例,其中一个列表是nil
而另一个不是。就你的功能而言,这意味着函数具有不同度数的多项式的系数列表。
如果您想单独处理目前缺少的两种情况,可以这样:
fun polyMult(M, N) = case (M,N) of
([], []) => []
| ([], y::ys) => ...
| (x::xs, []) => ...
| (x::xs, y::ys) => ...
当然,用你的实现替换点。我希望这有帮助,祝你好运。
答案 1 :(得分:0)
你需要这样做
fun foldL F y nil = y
| foldL F y (x::xr) = foldL F (F(x,y)) xr;
fun polymult(M:real list, nil) = nil
| polymult(nil, N) = nil
| polymult(m::mr, N) = foldL(fn(x,a) => x * a) m N::polymult(mr,N);
那就做你想要的。