我写了一些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)
答案 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, _)
,则会覆盖非单身的其他可能列表,这将消除非穷举匹配警告。
请注意,_
只是模式中的通配符,不会创建新的值绑定,因为您只需使用x
或y
来访问元组中的元组元素通配符的位置。