Рассмотрим следующую карту: Map.fromList [(1,"foo"), (2,"bar"), (3,"foo")]
Haskell: складной над картой, при обновлении вторичной карты
я хотел бы произвести: Map.fromList [(1,"foo"), (2,"bar"), (3,"1")]
. Последний ключ 3, ранее связанный с «foo», теперь связан с «1», поэтому, следуя этому значению (и преобразовая строку в число), я все равно могу получить «foo». Если результат был Map.fromList [(1,"3"), (2,"bar"), (3,"foo")]
, все было бы в порядке.
В идеале я бы выполнил это, сложив исходную карту. Наряду с этим я постепенно добавлял вторичную (обратную) карту с элементами («foo», 1), («bar», 2) и т. Д. Если текущий ключ находится на вторичной карте, вместо вставки он в окончательную карту, я бы вставлял его связанное значение.
Есть ли простой/изящный способ последовательности, без нескольких проходов или монады?
main = do
let names = Map.fromList [(1,"foo"), (2,"bar"), (3,"foo")]
link acc k v = -- insert into map1, depending map2's lookup
names' = Map.foldlWithKey link (Map.empty, Map.empty) names
putStrLn $ show names'
Это кажется очень странным. Казалось бы, немного менее странно, если бы вы хотели создать, скажем, «Map Integer (Либо целую строчку)», что делает его явным, является ли значение окончательным или ссылкой. Но даже с этим изменением это немного странно. Зачем тебе это нужно? – dfeuer
Действительно ... Это адаптация моего фактического случая, минимальный пример, который я мог бы придумать, чтобы показать суть моих сомнений: обновление вторичной структуры данных при отображении/складывании по карте. –