Удалить элементы из списка в мл

Я пытаюсь написать функцию, которая создает новый список, содержащий данный список без элемента x.

Московский ОД говорит, что некоторые случаи не используются в этом матче.

fun delete (x,list) = delete(x,[])
 |delete(x,(first::rest)) = if first = x then delete(x,rest) else first::delete(x,rest)

3 ответа

Вот как я это сделаю на Standard ML:

fun delete (item, list) =
    case list of
    []=>[]
      | xs::ys => if item = xs then delete(item,ys)
          else xs::delete(item,ys)

Без использования случаев:

fun delete (item, list) = List.filter(fn x => x <> item) list

Неважно, многозначные знаки.

Когда звонок в delete выполняется, паттерны, определяющие функцию, (по существу) пробуются по порядку. Поскольку первый шаблон уже соответствует каждому списку, второй шаблон никогда не будет достигнут. Вот почему компилятор жалуется.

Другими словами, вы должны либо изменить порядок своих дел, либо, лучше, сделать их непересекающимися (например, путем замены list с [] в первом случае).

Дополнительная подсказка: правая часть первого случая также кажется неправильной. Это всегда войдет в бесконечную рекурсию.

Это потому, что ваш первый случай соответствует любому списку, поэтому второй случай никогда не будет использован.
Помните, что дело рассматривается в том порядке, в котором оно написано, а не выбирается, исходя из того, какое совпадение является "наилучшим".

У вас также есть небольшая проблема бесконечной рекурсии с

delete (x,list) = delete(x,[])

поскольку list будет соответствовать []Буду вечно повторяться.
Если вы удалите что-то из пустого списка, результатом должен быть пустой список.

Вы можете сделать одну из двух вещей.

Либо сначала переместите непустой регистр:

fun delete (x, y:ys) = if y = x then delete(x, ys) else y::delete(x, ys)
  | delete (x, list) = []

Или, что более распространено, сделать так, чтобы первый случай соответствовал только пустому списку:

fun delete (x, []) = []
  | delete (x, y:ys) = if y = x then delete(x, ys) else y::delete(x, ys)
Другие вопросы по тегам