Что вы тестируете, 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]