2016-06-06 14 views
3
fun p(x::xl) = 
    if x::xl = [] then [] 
    else [0]; 

Получено предупреждение: матч не является исчерпывающим.Соединиться с ошибкой в ​​sml

х :: х => ...

То, что я хочу сделать, это:

р ([]) = []

Когда я делаю это, это дает неперехваченное исключение Совпадение [неудача неисполнения матча]

ответ

7

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

 Смежные вопросы

  • Нет связанных вопросов^_^