在Haskell中使用Data.Map的示例

Eli*_*lik 10 haskell hashtable

我是Haskell的新手,我需要定义一个空的Data.map,并通过使用insert函数并更新值来为其键分配一个"整数列表"(例如[1,2,3]).然后查找关键值.

到目前为止我尝试过的是:

import qualified Data.Map

foo num =
    let
        my_map  = Data.Map.empty

        new_map = bar my_map  num 1

    in
        Data.Map.lookup 1 new_map


bar my_map num c =
    if c > num then my_map
    else
        Data.Map.insert  c  [c] my_map
        bar my_map  num  c+1
Run Code Online (Sandbox Code Playgroud)

此代码不起作用.

你能举个简单的例子吗?

Lui*_*las 23

人们通常Data.Map使用此样板导入模块:

import Data.Map (Map)
import qualified Data.Map as Map
Run Code Online (Sandbox Code Playgroud)

我们的想法是,由于模块中的许多名称Prelude与其他模块发生冲突,因此您希望将它们用作限定名称,而不是Map类型本身.而as Map在第二线位不必类型可以节省你很多,你刚才说什么Map.map,Map.empty等等.

现在,构建映射的最简单和最常用的方法是使用fromList模块中的函数.这构造了Map一个键/值对列表:Map.fromList :: Ord k => [(k, v)] -> Map k v.要构造这个键/值对列表,您可以使用Haskell列表处理函数的全部功能,如下例所示:

myMap :: Integer -> Map Integer [Integer]
myMap n = Map.fromList (map makePair [1..n])
    where makePair x = (x, [x])
Run Code Online (Sandbox Code Playgroud)

GHCI的示例输出:

>>> myMap 3
fromList [(1,[1]),(2,[2]),(3,[3])]
Run Code Online (Sandbox Code Playgroud)

请注意,Map类型甚至将自身打印为fromList可重构它的调用.为什么?因为这个函数真的是构建一个最常用的方法Map.

相比之下,你在代码中所做的是你正在尝试编写一个命令式循环,它一次一个地增加一个条目的初始空映射.Haskell等价的循环是列表函数.在我的版本中,我使用了以下内容:

  1. [1..n]- 生成1最多的整数列表n.
  2. map- 为列表的每个元素应用一个函数.
  3. Map.fromList- Map从键/值对列表中构建a .

为了进一步证明这一点,如果你看一下源代码Map.fromList,它实际上是使用list fold函数定义的.

我建议你:Data.List在你解决之前先研究清单和模块Map.特别是:

  1. 了解那里有哪些功能以及可以执行的操作.
  2. 研究该foldr模块的功能 - 如何使用它,以及如何编写它.
  3. 学习如何编写自己的版本map,filterfind在以下方面foldr.


Mal*_*olm 8

这是一个演示此功能的小程序:

module Main where

import qualified Data.Map as M

main = do
    let emptyMap = M.empty
        mapWithKeys = M.insert 5 "Four" emptyMap
        mapWithKeys' = M.insert 5 "Five" mapWithKeys
    putStrLn $ mapWithKeys' M.! 5
Run Code Online (Sandbox Code Playgroud)

程序将使用键5插入"四",然后将值更新为"五",最后查找并打印它.

  • 每个绑定都不需要`let`.只有一个,适当的缩进,就足够了. (2认同)