Согласно вашему примеру, вы просто вызываете ваш qsort
с соответствующим списком несортированных значений и получаете отсортированный список:
some_useful_fun(X, Y) ->
% ...
Xsorted = qsort(X),
% do something with Xsorted
...
И это все. Там нет состояния в чисто функциональном программировании. Единственное состояние - это данные, передаваемые в качестве аргументов функциям. Функция должна возвращать один и тот же результат для переданных аргументов, несмотря на то, сколько раз вы ее вызывали.
В Erlang вы можете сопоставить свой объект с записью. Рассмотрим этот код:
-export([sort/0]).
-record(person,
{
name,
age
}).
persons_list() -> [
#person{name="John", age=38},
#person{name="Paul", age=25},
#person{name="Michael", age=23}
].
qsort(_Pred1, _Pred2, []) ->
[];
qsort(Pred1, Pred2, [Pivot|T]) ->
qsort(Pred1, Pred2, [X || X <- T, Pred1(X, Pivot)])
++ [Pivot] ++
qsort(Pred2, Pred2, [X || X <- T, Pred2(X, Pivot)]).
sort() ->
F1 = fun(#person{age = A1}, #person{age = A2}) ->
A1 =< A2 end,
F2 = fun(#person{age = A1}, #person{age = A2}) ->
A1 > A2 end,
qsort(F1, F2, persons_list()).
У нас есть запись person
, которая имеет два поля, в частности name
и age
. У нас также есть два предиката F1
и F2
, которые соответствуют тому, что делает qsort
. Если мы теперь вызовем qsort/3
с этими двумя предикатами и списком person
записей, мы получим следующие результаты:
1> c(persons).
{ok,persons}
2> persons:sort().
[{person,"Michael",23},
{person,"Paul",25},
{person,"John",38}]
3>
Это отсортированный список person
записей, которые вы затем можете использовать в своем коде.