我最近在使用 Map
输入来自 Data.Map
在 State Monad 内部,所以我想写一个函数,在 Map 中查找一个值,并从 State Monad 内部的 Map 中删除它。
我目前的实现是这样的:
lookupDelete :: (Ord k) => k -> State (Map k v) (Maybe v)
lookupDelete k = do
m <- get
put (M.delete k m)
return $ M.lookup k m
虽然这有效,但感觉效率很低。使用命令式语言中的可变映射,找到 delete
的情况并不少见。函数,也返回被删除的值。我找不到这个功能,所以如果有人知道一个(或可以解释为什么没有),我真的很感激
最佳答案
没有专门用于“删除和查找”的功能。相反,您使用更通用的工具:updateLookupWithKey是“查找和更新”,其中更新可以是删除或修改。
updateLookupWithKey :: Ord k =>
(k -> a -> Maybe a) -> k -> Map k a -> (Maybe a, Map k a)
lookupDelete k = do
(ret, m) <- gets $ updateLookupWithKey (\_ _ -> Nothing) k
put m
pure ret
关于dictionary - Haskell Data.Map 同时查找和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63564817/