将 list1 乘以 list2,得到 "Warning: match nonexhaustive"
Multiplying list1 by list2, getting "Warning: match nonexhaustive"
据我了解,
fun addX (X, []) = []
| addX (X, y::ys) = (X + y :: addX(X, ys));
工作得很好,但是当我尝试用这种方法将 list1 乘以 list2 时,它给了我 "Warning: match nonexhaustive",这是我的代码:
fun multList ([], []) = []
| multList (x::xs, y::ys) = (x * y :: multList(xs, ys));
我哪里做错了?任何帮助表示感谢,谢谢!
由于 x::xs
和 y::ys
匹配 "non-empty list",您当前的代码仅匹配以下模式:
([],[])
...两个列表都是空的
(x::xs,y::ys)
.. 两个列表都是非空的
所以你应该考虑这种情况 "one list is empty, and the another list is non-empty"。
以下是未显示警告的示例代码。
fun
multiList ([],[]) = []
| multiList (X,[]) = X
| multiList ([],X) = X
| multiList (x::xs, y::ys) = (x*y ::multiList(xs,ys));
此代码returns当任一列表为空时的非空代码。
编辑: 正如@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)
都不匹配时它会匹配任何内容。
据我了解,
fun addX (X, []) = []
| addX (X, y::ys) = (X + y :: addX(X, ys));
工作得很好,但是当我尝试用这种方法将 list1 乘以 list2 时,它给了我 "Warning: match nonexhaustive",这是我的代码:
fun multList ([], []) = []
| multList (x::xs, y::ys) = (x * y :: multList(xs, ys));
我哪里做错了?任何帮助表示感谢,谢谢!
由于 x::xs
和 y::ys
匹配 "non-empty list",您当前的代码仅匹配以下模式:
([],[])
...两个列表都是空的(x::xs,y::ys)
.. 两个列表都是非空的
所以你应该考虑这种情况 "one list is empty, and the another list is non-empty"。
以下是未显示警告的示例代码。
fun
multiList ([],[]) = []
| multiList (X,[]) = X
| multiList ([],X) = X
| multiList (x::xs, y::ys) = (x*y ::multiList(xs,ys));
此代码returns当任一列表为空时的非空代码。
编辑: 正如@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)
都不匹配时它会匹配任何内容。