让我们说我有两个列表,其中一个是布尔值:
[True, False, True]
[1, 2, 3]
是否有一个函数来逐个索引地比较这些列表,并创建一个新的列表" true"值?
[1, 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。
这是最简单的解决方案,我们可以预期编译器应将map
和filter
融合到单个列表遍历中。