匹配非详尽的sml

Jam*_*Jam 4 ml sml smlnj

fun p( x::xl ) =
  if x::xl = [] then []
  else [0];
Run Code Online (Sandbox Code Playgroud)

收到警告:匹配非详尽.

x :: xl => ...

我想做的是:

p([])= []

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

Sim*_*ine 8

你测试什么x::xl = [],永远不会是真的.列表是代数类型,定义为

datatype 'a list = :: of 'a * 'a list
                 | []
Run Code Online (Sandbox Code Playgroud)

意一个值,该值是一个列表是任一空列表一些元件放在另一个列表的前面.

因此,一旦您的初始模式匹配x::xl成功,您就知道它不是空的.(这应该是相当明显的,虽然,因为那会分配到x,如果x::xl是空的,空列表的第一个元素?)

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

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

fun p xs = if List.null xs then [] else [0]
Run Code Online (Sandbox Code Playgroud)