从我所学到的,
fun addX (X, []) = []
| addX (X, y::ys) = (X + y :: addX(X, ys));
工作得非常好,但是当我尝试将list1与list2相乘时,它会给我“警告:匹配非穷举”,这是我的代码:
fun multList ([], []) = []
| multList (x::xs, y::ys) = (x * y :: multList(xs, ys));
我做错了哪一部分?任何帮助表示感谢,谢谢!
答案 0 :(得分:4)
由于x::xs
和y::ys
匹配"非空列表",您当前的代码仅匹配模式:
([],[])
...这两个列表都是空的(x::xs,y::ys)
..两个列表都是非空的所以你应该考虑这个案例"一个列表是空的,另一个列表是非空的"。
以下是未显示警告的示例代码。
fun
multiList ([],[]) = []
| multiList (X,[]) = X
| multiList ([],X) = X
| multiList (x::xs, y::ys) = (x*y ::multiList(xs,ys));
当列表中的任何一个为空时,此代码返回非空的。
编辑:正如@ruakh在评论中所说,以下代码更好,因为它似乎是multiList
的自然行为,但我会留下上面的代码进行解释。
fun
multiList ([],[]) = []
| multiList (x::xs, y::ys) = (x*y ::multiList(xs,ys))
| multiList _ = raise Fail "lists of non equal length";
请注意,_
是通配符,因此当([],[])
和(x::xs,y::ys)
都不匹配时,它会匹配任何内容。