gpt4 book ai didi

dictionary - Data.Map中的map函数与fromList函数的联系

转载 作者:行者123 更新时间:2023-12-03 16:40:44 25 4
gpt4 key购买 nike

我不明白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

最佳答案

哇,看起来你很困惑。这是可以理解的,因为“ map ”这个词至少有四种不同的意思!

  1. 模块Data.Map (你好像很清楚这一点)
  2. 数据类型 Map.Map k v (在 Data.Map 模块中),它是一个有限映射,又名“字典”,又名“哈希表”(但它不使用哈希)
  3. 函数 Map.map (在 Data.Map 模块中)将函数应用于 Map 中的每个值(字典)
  4. 还有标准 map作用于列表的函数(在 Prelude 中),与 Map 无关s(字典)。

哇,好大一口!


这里是对签名的一些解释:

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

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)]

Map.map :: (a -> b) -> Map.Map k a -> Map.Map k b

这从类型为 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

fromList'只是 fromList 的自定义实现, 通过重复插入实现。它与 fromList 具有相同的签名,不出所料(但类型变量的命名不同——这没有区别)。

关于dictionary - Data.Map中的map函数与fromList函数的联系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54206991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com