我在理解如何遍历Haskell中的列表时遇到了一些困难。我一直在尝试使用mapM,但由于某种原因,我不断提出解析错误。我知道这可以递归完成,但迭代/ for循环中的代码只是整个函数的一小部分,所以我不想递归调用函数。例如,如果我有一个列表,如
[[0, 1, 2], [2, 3, 4], [4, 5, 6]]
我将如何首先遍历每个列表以查看每个列表中的值的总和是否> 5然后在每个列表中,迭代各个值以检查列表中是否有整数= 2(并且在这种情况下返回True)?
答案 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%清楚你想要做什么,但这里有一些可能有用的构建模块:
查找哪些列表的总和大于5:
Prelude> filter ((>5) . sum) [[0, 1, 2], [2, 3, 4], [4, 5, 6]]
[[2,3,4],[4,5,6]]
查找列表是否包含数字2:
Prelude> any (==2) [1,2,3]
True
Prelude> any (==2) [4,5,6]
False
结合上述内容,对每个总和大于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,[])]