尝试使用简单的哈希表algorithm,似乎对我使用Data.HashMap。我希望更好地理解如何实现一个可变的哈希表(这将是Data.HashTable.IO?),以便提高性能。我完全迷失了...试图修改示例here但是找不到我通过我获得的IO类型(双关语)的方式...提前感谢任何类型的演练或引用一。
例如,如何使用可变哈希表实现这个简单的练习?
import qualified Data.HashMap as HM (toList,lookup,insert,empty)
f list = g list HM.empty where
g [] h = HM.toList h
g (x:xs) h = case HM.lookup (x-1) h of
Just _ -> g xs (HM.insert x (x + 1) h)
Nothing -> g xs (HM.insert x x h)
答案 0 :(得分:6)
HM.insert
的类型签名是
insert :: IOHashTable h k v -> k -> v -> IO ()
从这个签名中我们可以看到insert
没有返回插入元素的新hashmap,它实际上是一个IO
动作,它为我们插入,改变旧的hashmap到位
同样,HM.lookup
也会在IO
monad中返回其结果:
lookup :: IOHashTable h k v -> k -> IO (Maybe v)
因此,我们需要做一些绑定这些函数返回的IO
操作的工作。我想你想要这样的东西。
f xs = g xs HM.empty
where g [] h = HM.toList h
g (x:xs) h = do
res <- HM.lookup (x-1) h
case res of
Nothing -> HM.insert h x x
Just _ -> HM.insert h x (x+1)
g xs h