Sml 警告:匹配非穷举

Sml 警告:匹配非穷举,sml,smlnj,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::ni

我用我能想到的所有基本情况编写了一些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)

以下是您的案例:

(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
,另一个参数应该是单例列表(仅包含一个元素的列表)。如果您在这些情况下使用
(\u0,nil)
(nil,\u0)
,您将涵盖其他可能的非单例列表,这将消除非穷举匹配警告

请注意,
\uuu
只是模式中的一个通配符,不会创建新的值绑定,因为您可以使用
x
y
访问通配符位置的元组元素