初级可变Haskell哈希表

时间:2013-07-12 18:21:08

标签: haskell

尝试使用简单的哈希表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)

1 个答案:

答案 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