在 sml 中匹配非详尽

Match non exhaustive in sml

fun p( x::xl ) =
  if x::xl = [] then []
  else [0];

收到警告:匹配不详尽。

x::xl => ...

我想做的是:

p([])=[]

当我这样做时,它给出了一个未捕获的异常匹配[非穷尽匹配失败]

您测试的内容 x::xl = [] 永远不会是真的。列表是代数类型,定义为

datatype 'a list = :: of 'a * 'a list
                 | []

表示作为列表的值是或者空列表放在另一个列表前面的某个元素。

因此,一旦 x::xl 的初始模式匹配成功,您就知道它不是空的。 (不过,这应该相当清楚,因为如果 x::xl 为空,它将分配给 x 什么;空列表的第一个元素?)

您在这里似乎混合了两种样式,一种是模式匹配,另一种是 if-then-else.

fun p [] = []
  | p (_::_) = [0]

fun p xs = if List.null xs then [] else [0]