警告:匹配nonexhaustive

时间:2014-09-18 07:56:49

标签: sml smlnj

我写了一些sml代码,包含了我能想到的所有基本情况,但是我仍然得到这个警告。因此,函数检查第一列表是否是第二列表的排列。我不确定它是否有效虽然我认为它进入无限循环!

fun isPermutation(nil: int list, nil: int list): bool = true
  | isPermutation(x::nil, nil) = false
  | isPermutation(nil, y::nil) = false
  | isPermutation(x1::nil, x2::nil) = if (x1=x2) then true else false
  | isPermutation(x1::l1, x2::l2) = isPermutation(x1::nil, x2::l2) andalso isPermutation(l1, x2::l2)

1 个答案:

答案 0 :(得分:1)

所以这些是你的情况:

(nil, nil)
(x::nil, nil)
(nil, y::nil)
(x1::nil, x2::nil)
(x1::l1, x2::l2)

但是,如果(x,y)([], [1,2,3]),则该函数不会匹配这些情况。这是因为在行(x::nil, nil)(nil, y::nil)中,您假设如果其中一个参数是nil,则另一个参数应该是单个列表(仅包含一个元素的列表)。如果您在这些情况下使用(_, nil)(nil, _),则会覆盖非单身的其他可能列表,这将消除非穷举匹配警告。

请注意,_只是模式中的通配符,不会创建新的值绑定,因为您只需使用xy来访问元组中的元组元素通配符的位置。