2016-12-27 2 views
2

Если у меня есть две клавиши k0 и k1, которые находятся в Data.Map M, как я могу удалить k0 из карты и заменить k1 ​​на k0?Заменить ключи в Data.Map

Что было бы лучшим подходом для выполнения этой задачи? Я попытался просмотреть документацию Data.Map, но мне удалось найти функции, которые могут изменять значения.

+0

Добро пожаловать в StackOverflow. Пожалуйста, найдите время, чтобы прочитать страницу справки, особенно разделы с названием [«Какие темы можно задать здесь?»] (Http://stackoverflow.com/help/on-topic) и [«Какие типы вопросов я должен не спрашивать? "] (http://stackoverflow.com/help/dont-ask). И что еще более важно, прочитайте [контрольный список вопросов переполнения стека] (http://meta.stackexchange.com/q/156810/204922). Вы также можете узнать о [Минимальных, Полных и Подтверждаемых примерах] (http://stackoverflow.com/help/mcve). –

+1

Я несколько не согласен с нисходящим. Вопрос мог бы показать еще несколько усилий, но задача под рукой достаточно мала, чтобы ее можно было точно описать в одном предложении, как это было сделано выше. – chi

ответ

6

Насколько я вижу, нет единой библиотечной функции, которая может эффективно выполнять это для вас. Тем не менее, вы можете сделать свой собственный способ сделать что-то вроде этого:

case M.lookup k0 myMap of 
    Nothing -> myMap 
    Just e -> M.insert k1 e (M.delete k0 myMap) 

Для этого потребуется три операции с картой, стоимость которых равна O (log N).

Мы можем сделать это в две операции следующим образом:

case updateLookupWithKey (\_ _ -> Nothing) k0 myMap of 
    (Nothing, _ ) -> myMap 
    (Just e, newMap) -> M.insert k1 e newMap 

Я не думаю, что это может быть дополнительно улучшен, так как при работе с двумя различными ключами мы должны получить доступ в два раз основного сбалансированного дерева поиска в любом случае ,

Смежные вопросы