List 多项式的SML乘系数
我有两个列表,其中包含两个不同多项式的系数,我想写一个可以将它们相乘的函数(即F-O-I-L) 我编写的函数并不完整,但是我只是用它来测试我对它应该如何工作的理解List 多项式的SML乘系数,list,sml,List,Sml,我有两个列表,其中包含两个不同多项式的系数,我想写一个可以将它们相乘的函数(即F-O-I-L) 我编写的函数并不完整,但是我只是用它来测试我对它应该如何工作的理解 fun polyMult(nil, nil) = nil | polyMult(M as x::xs, N as y::ys) = (x * y)::polyMult(xs, ys); 我走对了吗 此外,我还有一条错误消息,说明未捕获异常匹配[nonexhaustive Match failure] 这是什么意
fun polyMult(nil, nil) = nil
| polyMult(M as x::xs, N as y::ys) =
(x * y)::polyMult(xs, ys);
我走对了吗
此外,我还有一条错误消息,说明未捕获异常匹配[nonexhaustive Match failure]
这是什么意思?不幸的是,你没有走上正确的道路。您的函数只是用乘法将两个列表压缩,这不是F-O-I-L的工作方式。根据多项式乘法的定义,函数应该返回更高次的多项式。应该有助于你理解F-O-I-L 非穷举匹配错误意味着您没有覆盖模式匹配中两个列表的所有可能情况。事实上,您缺少两种情况,其中一个列表是
nil
,另一个不是。就你的函数而言,这意味着函数有不同程度多项式的系数列表
如果您想分别处理您目前缺少的这两个案例,您可以这样做:
fun polyMult(M, N) = case (M,N) of
([], []) => []
| ([], y::ys) => ...
| (x::xs, []) => ...
| (x::xs, y::ys) => ...
当然,用您的实现替换这些点。我希望这有帮助,祝你好运。你需要这样做
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);
我试着修改我的函数,它应该取
hd(M)
,并用hd(N)
乘以polyMult
=>fun polyMult(M,N)=(hd(M)*hd(N)):polyMult(M,tl(N))但是,我只得到了N@M.@mynorka的串联,该定义没有基本大小写,因此不起作用。既然你做了模式匹配,你可以像在问题中那样使用x::xs
和y::ys
,你不需要使用hd
和tl
。我仍然得到了两个串联列表的输出。有没有一个特定的函数可以让列表将两个元素相乘?如果你想找一个m([1,2,3],[4,5,6])
是[4,10,18]
的函数,你可以很容易地定义一个:fun m(l1,l2)=map op*(ListPair.zip(l1,l2))
问题中的函数做同样的事情,只是它只对长度相同的列表有效。如果您需要这样的函数,我建议在该函数中添加必要的额外情况。(这可能对F-O-I-L没有用处,但无论如何)