Так сказать, у меня есть список всех целых чисел от 2
до 20
.Удалить элементы n-1, n и n + 1 на основе условия для n в списке Haskell
[2 .. 20]
Я хочу, чтобы фильтровать по списку с помощью функции f x
(или это предикат? Я не очень привык ко всем терминов, используемых в программировании на Haskell). Если элемент в позиции n
равен true для этой функции f
, я хочу удалить элементы в положениях n-1
, n
и n+1
.
Пример: Допустим, что элемент в положении 4 в списке [2 .. 20]
, что составляет 6
, равно верно и для функции f
. Затем я хочу удалить элементы в позиции 3
, 4
и 5
, которые равны 5
, 6
и 7
соответственно. Так что мой окончательный список будет выглядеть так:
[2,3,4,8,9,10,11,12,13,14,15,16,17,18,19,20]
Я неопытный Haskell программист, просто играл для удовольствия. Я думал об использовании лямбда-функции в качестве предиката, но я не совсем уверен, как это сделать. Я также думал об использовании функции, такой как remove xs ys
, которая удаляет все элементы в xs
, что также является элементом ys
, но я не уверен, как это сделать.
Любая помощь будет оценена!
EDIT: Я понял, что удаление обоих смежных элементов неверно, чтобы получить результат, который я хотел. Кроме того, может быть лучше просто изменить значение затронутых элементов (элементы в позициях n
и n-1
) до 0
или пометить их каким-либо другим способом, а не удалять их целиком. Причиной этого является то, что я хочу сохранить «удаление» элементов до тех пор, пока в списке больше не будет элементов, которые соответствуют предикату (и их предшествующим элементам). Я только хочу «удалить» их из Исходный список. Поскольку мой подход сильно изменился с первоначального вопроса, я отправлю новый, чтобы отразить мой новый подход. Я хочу поблагодарить вас за все ответы, и я многому научился из ваших ответов. Спасибо!
EDIT 2: Вот мой новый вопрос: Remove elements at positions n and n-1 in a Haskell list, when n fits a predicate
Для вашей функции удалить, предикат просто переменный. Я предлагаю сопоставление шаблонов обучения. BTW, это хорошая задача для изучения передовых методов обработки. – Ingo
Что делать, если оба элемента в позиции 4 и элемент в позиции 5 проходят предикат? Какие элементы будут удалены? Элементы в положениях 3, 4, 5 и 6? –
Вы указали прямо на точку, где списки Хеккелла сосут немного. AFAIK, нет стандартных комбинаторов для обработки логических зависимостей между элементами. Я могу предложить только явные рекурсии или молнии. – user3974391