匹配非详尽的sml

时间:2016-06-06 22:59:34

标签: sml smlnj ml

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

收到警告:匹配非详尽。

x :: xl => ...

我想做的是:

p([])= []

当我这样做时,它会给出一个未被捕获的异常匹配[nonexhaustive match failure]

1 个答案:

答案 0 :(得分:8)

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

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

意味着作为列表的值是 空列表某个元素放在另一个列表前面。

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

你似乎在这里混合了两种风格,一种是模式匹配,另一种是 if-then-else

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

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