Насколько я вижу, нет единой библиотечной функции, которая может эффективно выполнять это для вас. Тем не менее, вы можете сделать свой собственный способ сделать что-то вроде этого:
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
Я не думаю, что это может быть дополнительно улучшен, так как при работе с двумя различными ключами мы должны получить доступ в два раз основного сбалансированного дерева поиска в любом случае ,
Добро пожаловать в 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). –
Я несколько не согласен с нисходящим. Вопрос мог бы показать еще несколько усилий, но задача под рукой достаточно мала, чтобы ее можно было точно описать в одном предложении, как это было сделано выше. – chi