# [erlang-questions] Swap 2 elements within a list a la Erlang ?

Andreas Bakurov andreasmk2@REDACTED
Sat Jun 9 11:34:20 CEST 2007

```Hello all. I am new to Erlang and face a lot of  dilemmas.
I have implemented Knuth's or Fisher-Yates shuffle in Erlang
, The main mechanism of this algorithm is swapping  two elements within
a list : what I wrote is

% For A < B
swap_elements(A, B, List) ->
{P1,T1} = lists:split(A - 1, List),
[Elem1 | T2] = T1,
{P2, T3} = lists:split(B - length(P1) - 2, T2), % -2 is because we
removed 1 element from T2 and one less 1 because of 0 based index
[Elem2 | P3] = T3,
lists:flatten([P1, Elem2, P2, Elem1, P3]).

It splits a list in 5 parts two are element the rest are the parts
surrounding them. Then puts the parts at the same places and elements in
inverse order.

It works but it seems ugly to me and not in a spirit of functional
programming , furthermore it is slow for lists of 10000 elements and more.
Is there a more elegant way to write this function ? If yes, please send
me an example...

--Sincerely
Andreas

```