ublog

erlang - лямбди, паттерн метчінг, фільтрування та сортування

programming [35]erlang [33]

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

наступний код, як ми можемо бачити, працює не так як гадалось
тобто, паттерн метчінг всередині 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}]



ось так :)