Самое главное - помнить, что вы должны создать совершенно новый список, поэтому вам следует подумать о том, как лучше всего получить то, что вы ищете, а не о том, как воспроизвести то, как вы бы справились с этим на другом языке.
Если, например, вы хотите сравнить элементы с близлежащими элементами, вы можете сжать список с его смещением:
iex> enum = 1..5
1..5
iex> stream = Stream.drop(enum, 1) # Enum.drop/2 would also work
#Stream<[enum: 1..5, funs: [#Function<48.15162342/1 in Stream.drop/2>]]>
iex> Enum.zip(enum, stream) # Stream.zip/2 works if you're going to iterate
[{1, 2}, {2, 3}, {3, 4}, {4, 5}]
Для вашего конкретного примера, где следующее значение является предыдущимзначение отрицается, вы можете создать бесконечный поток и взять то, что вам нужно:
iex> 1 |> Stream.iterate(&-/1) |> Enum.take(3)
[1, -1, 1]
Если вы хотите изменить только одно значение, вам придется создать новый список с изменением только нового значения( ПРИМЕЧАНИЕ это не тот способ, которым вы хотите сделать несколько обновлений):
iex> {previous, [current | next]} = Enum.split(1..5, 3)
{[1, 2, 3], [4, 5]}
iex> Enum.concat([previous, [current * 12], next])
[1, 2, 3, 48, 5]