我目前正在为我在奥地利的学习撰写学士论文。
我使用的编程语言是Haskell。
现在,我正在尝试找到解决以下问题的方法:
我有一个元组列表,让我们说[(1,2),(2,3)]
。从那个元组列表中,我现在想要挑选出每个元组,然后对它进行操作:
Map.insert (1,2) XXX ftable
哪里
(1,2)
是该列表的第一个元素,XXX
是一些值,ftable
是我的地图。
如何通过该列表“迭代”并继续将我列表中的“第n个”元素插入我的地图?
我想我对编程命令太熟悉了,我找不到在Haskell中修复它的方法。
答案 0 :(得分:5)
这里的含义并不完全清楚。假设元组用于表示地图中的键并且XXX是否附加到特定键的某些值,这是正确的吗?是否还要在列表中提供要与给定键匹配的所有值?在这种情况下,您可以轻松使用fromList
中的Data.Map
函数:
keys = [(1,2),(2,3),(7,9)]
values = ["A","B","C"]
map = Data.Map.fromList $ zip keys values
答案 1 :(得分:3)
想想你的循环在做什么。
map
(或concatMap
)filter
foldl
,foldr
;更具体的折叠为sum
,and
等)在你的情况下,我并不完全确定你想要什么,但我认为你最终想要一个Map
,所以你想要折叠你的清单。也许像是
foldl (\oldMap key -> Map.insert key xxx oldMap) ftable yourListOfTuples
答案 2 :(得分:1)
您可以使用多个选项来迭代列表,每个选项都会根据您要搜索的效果进行选择:
最后,无论你使用什么函数或技术,它都将基于递归,因为像Haskell这样的函数语言不会以你习惯的形式承认for循环。
答案 3 :(得分:1)
建立hakoja的建议......
此时XXX可能是1)每个键的常量,或者2)某个基于键的函数,或3)以某种方式与键并行定义。
1)每个键的常量xxx
keys = [(1,2),(2,3),(7,9)]
xxx = "A"
ftable = Data.Map.fromList $ zip keys (repeat xxx)
2)函数根据键
生成值keys = [(1,2),(2,3),(7,9)]
f = ...
ftable = Data.Map.fromList $ zip keys (map f keys)
3)xxx并行定义:使用hakoja的建议