Задание карты

Задание карты — удобный инструмент для создания карты с помощью генераторов и фильтров, аналогичный заданию списка. То же: map comprehension.

В общем виде задание карты выглядит так:

#{ Выражение1 => Выражение2 || Квалификатор1, Квалификатор2... }

Квалификаторы, как и в случае с заданием списка, бывают двух видов:

Первым квалификатором можно поставить и фильтр, но, конечно, обычно ставят генератор — чтобы было потом что фильтровать. Пример задания карты:

1> #{ X => X*X || X <- [1,2,3] }.
#{1 => 1,2 => 4,3 => 9}

Выражение1 (ключ) здесь это X. Выражение2 (значение) здесь это X*X. Фильтров здесь нет, генератор X <- [1,2,3] по очереди производит значения 1, 2 и 3, из которых и составляются пары Ключ-Значение, из которых и будет состоять итоговая карта #{1 => 1,2 => 4,3 => 9}.

Следует обратить внимание на парочку нюансов, отличающих задание карты от задания списка. Во-первых, в задании списка мы привыкли видеть слева от || выражение, которое во что-то вычисляется. Выражение1 => Выражение2 это не выражение, это просто такая языковая конструкция — часть задания карты. Стоит, однако, оговориться — начиная с OTP 29 будет возможна в задании списка конструкция вида [ Выр1,Выр2 || ...].

Во-вторых, в похожих ситуациях задание карты может создавать меньшее количество элементов, нежели задание списка.

1> [{X,Y} || X <- [a,b,c], Y <- [1,2]].
[{a,1},{a,2},{b,1},{b,2},{c,1},{c,2}]
2> #{X => Y || X <- [a,b,c], Y <- [1,2]}.
#{c => 2,b => 2,a => 2}

Это объясняется просто: у карты не может быть пар с одинаковыми ключами. Поэтому вместо пар a => 1 и a => 2 остаётся только a => 2 (последняя). В связи с этим следует быть внимательным: при переборе комбинаций не все пары возможны.

Альтернатива заданию карты — использовать сначала задание списка для получения списка кортежей {Ключ,Значение}, потом преобразовать его в карту с помощью maps:from_list/1. Но задание карты, конечно, удобнее и быстрее.


Copyright © 2026 Алексей Карманов