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
哇,看起来你很困惑.这是可以理解的,因为"地图"这个词至少意味着四种不同的东西!
Data.Map(你似乎很清楚这个)Map.Map k v(中Data.Map模块),这是一种有限的地图,又名"词典",又名"哈希表"(但它不使用散列)Map.map(中Data.Map这在应用一个函数的每个值模块)Map(字典)map函数(在Prelude)中可以在列表上运行,并且与Maps(字典)无关.哇,真是满口!
以下是签名的一些解释:
Map.fromList :: (Ord k) => [(k, a)] -> Map.Map k a
Run Code Online (Sandbox Code Playgroud)
Map.Map k a是一个带有两个参数的参数化数据类型,k和a.如果您熟悉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,不足为奇(但类型变量的命名方式不同 - 这没有区别).
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |