2015-10-04 2 views
0

Я пытаюсь написать функцию для удаления списка из другого списка.Удаление списка SML

''a list -> ''a list -> ''a list 

Вот что я до сих пор:

fun delete _ [] = [] | 
    delete (h1::t1) (h2::t2) = 
    if h1=h2 
    then t2 
    else h2::delete (h1::t1) t2; 

Я использую MoscowML, и это дает мне Внимание: сопоставление с образцом не является исчерпывающим ошибка.

Испытание вышеприведенной функции:

- delete [4,5] [1,2,3,4,5,6,7,8]; 
> val it = [1,2,3,5,6,7,8] : int list 

Нужный выход:

> val it = [1,2,3,6,7,8] : int list 

ответ

1

Есть две проблемы:

1- Почему переводчик повышения Предупреждение: соответствие шаблону не является исчерпывающей ошибкой

2- Что можно сделать, чтобы код работал.

Что касается первого пункта, причина предупреждения заключается в том, что вы не проверяете каждую возможную возможность. Функция delete, как это в настоящее время составляет чеки только две возможности:

-1 Второй список является пустой список (охватываемых схеме: _ [] =)

-2 Оба списка не является пустым (охватываемый второй рисунок: (h1::t1) (h2::t2) =)

Однако есть и третья возможность, а именно первый список, являющийся пустым списком. Следовательно, следующий ввод приведет к ошибке: delete [] [1,2,3,4,5,6]

Что касается второго пункта, если точное требование состоит в том, чтобы удалить из второго списка элементы первого списка подряд и только один раз, то ваше решение очень близко , Филиал else в порядке, только филиалу then нужно больше внимания. При коррекции then ветви я получаю следующие результаты:

delete [4,5] [1,2,3,4,5,6,7,8] = [1,2,3,6,7,8]; 
delete [5,4] [1,2,3,4,5,6,7,8] = [1,2,3,4,6,7,8]; 
delete [4,4,5] [1,2,3,4,5,6,7,8] = [1,2,3,5,6,7,8]; 
delete [4,5,6] [1,2,3,4,5,6,7,8] = [1,2,3,7,8]; 
delete [4,6,5] [1,2,3,4,5,6,7,8] = [1,2,3,5,7,8]; 
delete [4,6,5] [1,2,3,4,6,7,8,5] = [1,2,3,7,8]; 

Однако, если вы хотите удалить все элементы первого списка, происходящий во втором списке, независимо от их порядка, то вам нужно будет пересмотреть свой подход.

, например, если вы хотите следующий результат:

delete [4,6,5] [1,2,3,4,4,5,5,5,4,4,6,6,5,5,6,6,6,6,6,7,8,5] = [1,2,3,7,8];

, то вам необходимо сделать это в два этапа: Сначала напишем функцию del, что данный один элемент удалит все его вхождения в список: fun del e l = ... Его реализация практически идентична той, которую вы предоставили для delete, за исключением того, что вам нужно будет немного изменить ветвь then.

После того, как у вас есть del, теперь вы можете реализовать функцию delete, которая, учитывая список, удалит все вхождения этого списка во втором списке.Здесь вы будете использовать ранее определенную функцию del.

+0

Спасибо за интересный ответ! Моя первоначальная цель состояла в том, чтобы просто удалить элементы в том же порядке, что и первый список, но теперь это помогло мне просмотреть его по-разному. Мне удалось исправить код, исправив ветку «then»! – Arjun

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