2013-07-12 50 views
1

試驗一個簡單的哈希表algorithm,似乎爲我使用Data.HashMap。我希望更好地理解如何實現一個可以實現更快性能的可變哈希表(這是Data.HashTable.IO?)。我完全失去了...試圖修改here示例,但無法找到我通過IO類型返回(雙關語意圖)的方式...先感謝任何類型的漫遊或參考。Elementary Mutable Haskell哈希表

例如,如何使用可變哈希表來實現這個簡單的練習?

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) 

回答

6

HM.insert類型簽名是

insert :: IOHashTable h k v -> k -> v -> IO()

從這個簽名,我們可以看到,insert不與插入的元素返回一個新的HashMap,它實際上是一個IO動作,做爲我們插入,替換舊的散列映射。

同樣,HM.lookup返回其結果在IO單子太多:

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 
+0

謝謝!這讓我通過了case/lookup障礙(...似乎有更多的東西需要鍛鍊,但是,像'new'而不是'empty' ......以及如何顯示IO類型,比如'IO [(如果你有一個'x :: IO a',你可以使用'x >> = print'來顯示它 –

+2

方式,只是一個更有說服力的方式來說'\ list < - x;打印列表「# – cdk

+0

@groovy,它是,由'toList'的結果?) –