将list1乘以list2,得到“Warning:match nonexhaustive”

时间:2016-11-14 06:48:04

标签: sml smlnj

从我所学到的,

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));

我做错了哪一部分?任何帮助表示感谢,谢谢!

1 个答案:

答案 0 :(得分:4)

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