迭代Haskell中的列表列表?

时间:2018-03-09 17:42:53

标签: loops haskell functional-programming iteration

我在理解如何遍历Haskell中的列表时遇到了一些困难。我一直在尝试使用mapM,但由于某种原因,我不断提出解析错误。我知道这可以递归完成,但迭代/ for循环中的代码只是整个函数的一小部分,所以我不想递归调用函数。例如,如果我有一个列表,如

[[0, 1, 2], [2, 3, 4], [4, 5, 6]]

我将如何首先遍历每个列表以查看每个列表中的值的总和是否> 5然后在每个列表中,迭代各个值以检查列表中是否有整数= 2(并且在这种情况下返回True)?

3 个答案:

答案 0 :(得分:2)

  

我将如何首先遍历每个列表以查看每个列表中的值的总和是否> 5

让我们说你的清单是

l = [[0, 1, 2], [2, 3, 4], [4, 5, 6]]

您可以使用filter获取值总和超过五的列表。 filter的第一个参数是函数(\xs -> sum xs > 5),给定列表xs,决定其元素的总和是否大于5

> filter (\xs -> sum xs > 5) l
[[2,3,4],[4,5,6]]
  

然后在每个列表中,迭代各个值以检查列表中是否有整数= 2

与之前相同,您使用过滤器,但现在检查数字2是否是每个列表的元素xs

> filter (\xs -> 2 `elem` xs) l
[[0,1,2],[2,3,4]]

答案 1 :(得分:2)

我并不是100%清楚你想要做什么,但这里有一些可能有用的构建模块:

  1. 查找哪些列表的总和大于5:

    Prelude> filter ((>5) . sum) [[0, 1, 2], [2, 3, 4], [4, 5, 6]]
    [[2,3,4],[4,5,6]]
    
  2. 查找列表是否包含数字2:

    Prelude> any (==2) [1,2,3]
    True
    Prelude> any (==2) [4,5,6]
    False
    
  3. 结合上述内容,对每个总和大于5的列表给出True / False:

    Prelude> (map (any (==2)) . filter ((>5) . sum)) [[0, 1, 2], [2, 3, 4], [4, 5, 6]]
    [True,False]
    

答案 2 :(得分:0)

列表推导是迭代的。我不确定你想要什么,所以下面创建一个大于5的每个列表的元组的元组和元组的第二项天气列表中的任何元素是2.检查元素等于2是另一个短列表理解。

[(a,[True|t<-b,t == 2])|b<-[[0,1,2],[2,3,4,5],[6,7,8]], a<-[sum b], a>5]
  

[(14,[TRUE]),(21,[])]