给定布尔值列表,比较并创建一个新列表

时间:2014-03-27 02:12:26

标签: haskell

让我们说我有两个列表,其中一个是布尔值:

[True, False, True]
[1, 2, 3]

是否有一个函数来逐个索引地比较这些列表,并创建一个新的列表" true"值?

[1, 3]

3 个答案:

答案 0 :(得分:8)

此外,列表理解在这里可以非常有效地使用:

[ghci] let a = [True, False, True]
[ghci] let b = [1,2,3]
[ghci] [ b1 | (a1, b1) <- zip a b, a1]
[1,3]
[ghci] 

答案 1 :(得分:6)

这样可以解决问题:

fliterAccordingTo :: [Bool] -> [a] -> [a]
filterAccordingTo bs xs = map snd . filter fst $ zip bs xs

zip将布尔值与值绑定,filter fst仅选择True作为第一个元素的对,map snd生成一个仅包含第二个元素的列表对(即值)。

答案 2 :(得分:5)

不是默认情况下,但创建一个

非常简单

zip获取两个列表并创建一个新列表,每个元素配对在一起。我们可以使用filter删除不满足谓词的项,然后使用map将函数应用于列表的所有元素。

transform :: [Bool] -> [a] -> [a]
transform xs = map ???2 . filter ???1 . zip xs

由于这看起来有点像家庭作业,我会让你填写???

如果对的第一个元素为真且???1应返回第二个元素,

???2应该返回true。

这是最简单的解决方案,我们可以预期编译器mapfilter融合到单个列表遍历中。