Знайомство з Erlang [18]

трішки про fun (лямбди), паттерн матчинг (pattern matching) в fun,
про фільтрування та сортування в erlang

наступний код, як ми можемо бачити, працює не так як гадалось
тобто, паттерн метчінг всередині fun не включає назву змінної в декларації вітки
(лише всередині вітки(кляузи), забігаю наперед :) )

1> A = 5.
5
2> F = fun({_,A}) -> true;(_) -> false end.
#Fun<erl_eval.6.99386804>
3> F({7,7}).
true
4> F({5,5}).
true

наступний варіант -- уже працює як нам хочеться

1> A = 5.
5
2> F = fun({_,Id2}) -> case Id2 of A -> true; _ -> false end end.
#Fun<erl_eval.6.99386804>
3> F({7,7}).
false
4> F({5,5}).
true

приклад фільтрування списку кортежів з використання fun

1> A = [{"zzz",5},{"fff",2},{"sss",7},{"yyy",1}].
[{"zzz",5},{"fff",2},{"sss",7},{"yyy",1}]
2> F = fun({_,7}) -> true; (_) -> false end.    
#Fun<erl_eval.6.99386804>
3> lists:filter(F,A).
[{"sss",7}]

приклад сортування списку кортежів по певному ключу
(памятаємо, що в erlang нумерація елементів розпочинається з 1,
не з 0 як в php/js/etc)

1> lists:keysort(2,[{"zzz",5},{"fff",2},{"sss",7},{"yyy",1}]).
[{"yyy",1},{"fff",2},{"zzz",5},{"sss",7}]

2> lists:keysort(3,[{"zzz",0,5},{"fff",0,2},{"sss",0,7},{"yyy",0,1}]).
[{"yyy",0,1},{"fff",0,2},{"zzz",0,5},{"sss",0,7}]

Продовження

Посилання

https://erlang.org/doc/man/lists.html
https://github.com/yzh44yzh/practical_erlang/blob/master/03_high_order_fun/lesson_03.md