将 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::xsy::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) 都不匹配时它会匹配任何内容。