模拟haskell中的for循环

时间:2012-03-17 16:04:55

标签: haskell for-loop

我目前正在为我在奥地利的学习撰写学士论文。

我使用的编程语言是Haskell。

现在,我正在尝试找到解决以下问题的方法: 我有一个元组列表,让我们说[(1,2),(2,3)]。从那个元组列表中,我现在想要挑选出每个元组,然后对它进行操作: Map.insert (1,2) XXX ftable 哪里 (1,2)是该列表的第一个元素,XXX是一些值,ftable是我的地图。

如何通过该列表“迭代”并继续将我列表中的“第n个”元素插入我的地图?

我想我对编程命令太熟悉了,我找不到在Haskell中修复它的方法。

4 个答案:

答案 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
  • 如果将列表缩小为汇总值,请使用折叠(例如foldlfoldr;更具体的折叠为sumand等)
  • 或者如果它正在进行上述某种组合,请使用上述功能的组合

在你的情况下,我并不完全确定你想要什么,但我认为你最终想要一个Map,所以你想要折叠你的清单。也许像是

foldl (\oldMap key -> Map.insert key xxx oldMap) ftable yourListOfTuples

答案 2 :(得分:1)

您可以使用多个选项来迭代列表,每个选项都会根据您要搜索的效果进行选择:

  • folds,它们对列表上的许多计算很有用。它们也可能是您正在寻找的,但我不明白您的具体问题。
  • map,它在输入列表的每个元素上应用相同的(给定)函数,返回结果列表。还有variants that works in monadic computations
  • 或者,如果它最适合您的需求,您可以随时编写自己的tail recursive函数:haskell将像处理循环一样对待它们而不消耗堆(但请查看参考链接以获得有关的详细解释)技术)。

最后,无论你使用什么函数或技术,它都将基于递归,因为像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的建议