ublog

Знайомство з erlang: продовження про списки

programming [41]erlang [39]

Вітаю!

Деяку роботу зі списками ми уже розглядали в постах
https://blog.clever-games.win/post/12
https://blog.clever-games.win/post/11
https://blog.clever-games.win/post/2

Продовжимо - відкриємо консоль і:

1> A = [7,5,2,9].
[7,5,2,9]
2> erlang:length(A).
4
3> lists:nth(2,A).
5
4> lists:member(8,A).
false
5> lists:delete(2,A).
[7,5,9]
6> A.
[7,5,2,9]

думаю, тут все зрозуміло без додаткових пояснень,
продовжимо:

7> List = [1,2,3,4,5].
[1,2,3,4,5]
8> F = fun(V) -> V * 2 end.    
#Fun<erl_eval.6.99386804>
9> lists:map(F, List).
[2,4,6,8,10]


10> List2 = [{user, 1, "Bob"}, {user, 2, "Alice"}, {user, 3, "Bill"}].
[{user,1,"Bob"},{user,2,"Alice"},{user,3,"Bill"}]
11> F2 = fun({user, Id, Name}) -> {user, Id, string:to_upper(Name)} end.
#Fun<erl_eval.6.99386804>
12> lists:map(F2, List2).
[{user,1,"BOB"},{user,2,"ALICE"},{user,3,"BILL"}]


за допомогою lists:map/2 ми застосували визначену функцію до кожного елемента заданого списку,
отримали новий список

13> lists:filter(fun(V) -> V > 3 end, List). 
[4,5]
14> lists:filter(fun({user, Id, _}) -> Id rem 2 =:= 0 end, List2).
[{user,2,"Alice"}]


за допомогою lists:filter/2, у який ми передаємо функцію у якості предикату, ми отримали новий, профільтрований список


15> List3 = [1,2,3,4,5].
[1,2,3,4,5]
16> lists:foldl(fun(Item, Acc) -> Acc + Item end, 0, List3).
15
17> lists:foldl(fun(Item, Acc) -> Acc * Item end, 1, List3).
120


тут ми отримали суму та добуток всіх елементів списку
lists:foldl/3 - розгортка: ми передаємо функцію, котра виконує певну роботу з елементом списку та акумулятором, власне сам акумулятор та список,
в результаті отримуємо кінцевий результат-акумулятор


18> List4 = [-2,-1,0,1,2].
[-2,-1,0,1,2]
19> [X || X <- List4, X > 0].
[1,2]
20> [X * 2 || X <- List4].
[-4,-2,0,2,4]
21> [X * 2 || X <- List4, X > 0].
[2,4]


конструктор (генератор) списків у дії (lists comprehention)
також існує бінарний варіант

22> [ X || <<X>> <= <<1,2,3,4,5>>, X rem 2 == 0].
[2,4]
23> << <<Bin/binary>> || Bin <- [<<3,7,5,4,7>>] >>.
<<3,7,5,4,7>>
24> << <<(X+1)/integer>> || <<X>> <= <<3,7,5,4,7>> >>.
<<4,8,6,5,8>>


Завдяки lists comprehention ми маємо наступну фішечку -

25> [X || X <- "test\\7{8}\"9[70]1", X =/= $\", X=/=${, X=/=$}, X=/=$\\, X=/=$[, X=/=$]].    
"test789701"

ми вирізали зі спискової строки "test\7{8}"9[70]1" символи "{}\[] :)


ще більше функцій для роботи зі списками та списковими строками ви можете знайти в ерланг-документації -
http://erlang.org/doc/man/lists.html
http://erlang.org/doc/man/string.html


Далі буде)