Работа над списком обновлена ​​на go в списке понимания - PullRequest
1 голос
/ 26 февраля 2020

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

Например, в этом коде :

let n_nums = [replaceAt n (nums!!(n + 1)) nums | n <- [0..length nums]]

replaceAt всегда работает на nums, тогда как я хотел бы, чтобы он работал на n_nums со второй итерации, а затем над недавно обновленным списком на третьей итерации и т. Д. на. Что такое умный способ сделать это?

1 Ответ

1 голос
/ 26 февраля 2020

Невозможно сделать со списком (если не используется zip - см. Ниже) .

Использовать scanl :: (b -> a -> b) -> b -> [a] -> [b] или iterate :: (a -> a) -> a -> [a] или mapAccumL :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y]) и другие связанные с ним функции высшего порядка, для этого. iterate с (!! n) по сравнению с его результатом, вероятно, лучше всего подходит здесь. Или scanl над списком индексов [1..n]. Или что-то в этом роде.

Конечно, рекурсивный код с ручным кодированием всегда возможен.

Во-вторых, с использованием zip, вход может быть сопряжен с результатом, сдвинутым на одну ступень с помощью tail, этот извлеченный результат может быть извлечен из понимания списка ... для создания результата!

См. предположительно невозможное определение sum в терминах map (который также использует zip и last).

...