Data.Map中的map函数与fromList函数之间的连接

Jun*_*ung 2 dictionary haskell map-function

我不理解Map.map(Data.Map中的map函数)和Map.fromList的签名.功能本身就在签名中.我也不确定为什么在我想要实现Map.member或Map.filter或Map.size等其他函数时总是调用Map.fromList.就像为什么我不能直接在列表中应用函数,而是必须通过Map.fromList间接应用它.

最后但并非最不重要的...... fromList'的签名.我注意到被调用的Map.Map函数有一个大写M而不是小m,它是关闭的(参考第二行的Map.map)为什么会这样?

非常感谢

Map.fromList :: Ord k => [(k, a)] -> Map.Map k a
Map.map :: (a -> b) -> Map.Map k a -> Map.Map k b

fromList' :: (Ord a) => [(a,b)] -> Map.Map a b
fromList' = foldl (\acc (a,b) -> Map.insert a b acc) Map.empty
Run Code Online (Sandbox Code Playgroud)

luq*_*qui 12

哇,看起来你很困惑.这是可以理解的,因为"地图"这个词至少意味着四种不同的东西!

  1. 模块Data.Map(你似乎很清楚这个)
  2. 数据类型 Map.Map k v(中Data.Map模块),这是一种有限的地图,又名"词典",又名"哈希表"(但它不使用散列)
  3. 功能 Map.map(中Data.Map这在应用一个函数的每个值模块)Map(字典)
  4. 还有标准map函数(在Prelude)中可以在列表上运行,并且与Maps(字典)无关.

哇,真是满口!


以下是签名的一些解释:

Map.fromList :: (Ord k) => [(k, a)] -> Map.Map k a
Run Code Online (Sandbox Code Playgroud)

Map.Map k a是一个带有两个参数的参数化数据类型,ka.如果您熟悉C++系列中的泛型,则可能会编写此内容Map<K, A>.

fromList函数获取(键,值)对的列表[(k, a)],并返回字典.字典的键具有类型k,值具有类型a. (Ord k)表示密钥必须相对于彼此可订购,因为它将数据结构存储为已排序的平衡树.

-- A dictionary from people's names to their age
ages :: Map.Map String Int
ages = Map.fromList [("Bill", 32), ("Carol", 71), ("Diddy", 13)]
Run Code Online (Sandbox Code Playgroud)
Map.map :: (a -> b) -> Map.Map k a -> Map.Map k b
Run Code Online (Sandbox Code Playgroud)

这需要一个函数,从类型a的东西到类型的东西b作为它的第一个参数.作为第二个参数,它从任何键类型k到类型的东西都需要一个字典a,它将函数应用于字典中的每个值,从相同的键类型返回字典到类型的东西b.

-- A dictionary from people's names to whether they are allowed to drink alcohol
canDrink :: Map.Map String Bool
canDrink = Map.map (\age -> age >= 21) ages
Run Code Online (Sandbox Code Playgroud)

fromList'只是一个自定义实现fromList,通过重复插入实现.它具有相同的签名fromList,不足为奇(但类型变量的命名方式不同 - 这没有区别).