好的,我正在努力学习哈斯克尔。有几次我发布了被投票的问题,因为我无法解释我想要实现的目标,但我将再次尝试一个新问题。
我找到了一段我想要修改的代码。这是:
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
的情况下做同样的事情答案 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个小改动(不计入导入的丢弃)。