Невозможно сделать со списком (если не используется 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
).