При работе со списками все элементы часто имеют одинаковый тип данных или значение.Вы редко видите списки типа ["John Doe","1970-01-01","London"]
, а скорее #person{name="John Doe",...}
или даже {"Джон Доу", ...}.Чтобы изменить значение в записи и кортеже:
-record(person,{name,born,city}).
f(#person{}=P) -> P#person{city="New City"}. % record
f({_,_,_,}=Tuple) -> erlang:setelement(3,Tuple,"New City"). % tuple
Это может ничего не решить для вашей конкретной проблемы.Чтобы взять собственный пример в комментариях:
f1([H1,H2,_H3,H4,H5],E) -> [H1,H2,E,H4,H5].
Если вы дадите более конкретное описание среды и проблемы, проще будет выбрать, какое решение лучше всего подойдет.
Редактировать: Один (довольно плохо) решение 1.
replacenth(L,Index,NewValue) ->
{L1,[_|L2]} = lists:split(Index-1,L),
L1++[NewValue|L2].
1> replacenth([1,2,3,4,5],3,foo).
[1,2,foo,4,5]
Или немного более эффективно в зависимости от длины ваших списков.
replacenth(Index,Value,List) ->
replacenth(Index-1,Value,List,[],0).
replacenth(ReplaceIndex,Value,[_|List],Acc,ReplaceIndex) ->
lists:reverse(Acc)++[Value|List];
replacenth(ReplaceIndex,Value,[V|List],Acc,Index) ->
replacenth(ReplaceIndex,Value,List,[V|Acc],Index+1).
Еще лучше моя функция f1 выше, но, может быть, просто может быть проблемавсе еще находится, как описано выше, или здесь .