删除Haskell中Data.Map的必要性

时间:2014-02-01 19:47:47

标签: regex haskell

好的,我正在努力学习哈斯克尔。有几次我发布了被投票的问题,因为我无法解释我想要实现的目标,但我将再次尝试一个新问题。

我找到了一段我想要修改的代码。这是:

import qualified Data.Map as M

type Dict = M.Map String String

translate :: Dict -> [String] -> [String]
translate dict words = map trans words
  where
    trans :: String -> String
    trans w =
      case M.lookup w dict of
        (Just w') -> w'
        Nothing   -> "whatchamacallit"

testTranslation :: Dict -> IO ()
testTranslation dict = do
    print $ translate dict ["where", "is", "the", "colosseum"]

testInsertion :: Dict -> IO Dict
testInsertion dict = do
    return $ M.insert "colosseum" "colosseo" dict

main = 
    let dict = M.fromList [("where", "dove"), ("is", "e"), ("the", "il")]
    in do
          testTranslation dict
          dict'  <- testInsertion dict
          testTranslation dict'
          putStrLn "The original dictionary is unchanged:"
          testTranslation dict

简而言之:它将用 dove 取代 元素, e 等,但它正在使用 Data.Map

所以我的问题是 - 有没有办法在不使用 Data.Map

的情况下做同样的事情

1 个答案:

答案 0 :(得分:6)

您可以将列表用作词典。当然,对于大词典来说这是不切实际的,因为查找是O(N)。

以下是列表查找的类型签名:

lookup :: Eq α => α -> [(α, β)] -> Maybe β

这说明如下:

  

给定一个类型为a的项和一个元组列表(a,b),该函数将返回Nothing或Just someb,其中someb的类型为b。

正如你可以很容易地发现你是否在ghci中使用该函数玩了一下,如果元组的第一部分等于键,它将返回元组中的第二个值。

因此:

lookup 42 [(1, "one"), (42, "it"), (2, "bar")]  

应该是

Just "it"

,而

lookup 77 [(1, "one"), (42, "it"), (2, "bar")]

应该是

Nothing

你可以在GHCi中尝试它,你应该在程序中摆脱Data.Map太难了。据我所知,只有3个小改动(不计入导入的丢弃)。