如何在 Haskell 中同时迭代两个列表?

200*_*eon 2 sorting haskell functional-programming filtering data-structures

本质上我想做的是:给定一个由元组[(x,[y])]和另一个字符串列表组成的列表[a],我想创建一个包含所有 的新列表,[y]如果x == a这是有意义的,所以如果我有[('a', ['z', 'k', 'x']), ('b', ['z']), ('c', ['y', 'j'])]['a', 'c'],则结果列表列表是通过函数传递的[['z', 'k', 'x'], ['y', 'j']]

我想出的解决方案有点荒谬且过于复杂(而且不起作用),但只是为了让您可以看到我一直在考虑的路径类型,我将其发布在下面。

foo ys xs acc = map (\x -> (map (\(a,y) -> if x == a then y:acc else []) ys)) xs
Run Code Online (Sandbox Code Playgroud)

这打印了我想要的东西,但也打印了大量额外的括号,这使得输出超级混乱,毫无疑问,因为我已经破坏了地图函数。有什么建议么?

Enr*_*lis 5

给定

l1 = [('a', ['z', 'k', 'x']), ('b', ['z']), ('c', ['y', 'j'])]
l2 = ['a', 'c']
Run Code Online (Sandbox Code Playgroud)

一个快速直观的解决方案是

filter (\(c,_) -> c `elem` l2) l1
Run Code Online (Sandbox Code Playgroud)

该过滤器l1仅保留第一个元素是elem的 ent 的那些对l2

过滤谓词(\(c,_) -> c `elem` l2)也可以写成((`elem` l2) . fst)


至于性能,如果l2排序和l1相对于fsts 排序的事实只是示例的可信度或过于简单化,我们可以观察到ing 是一个线性运算,因为您必须遍历tofilter的所有元素l1决定是否必须保留或过滤掉每一项。 `elem` l2但也许可以通过创建l2a来改进操作的查找Set,这只需更改为 即可 `elem` l2完成 `elem` Data.Set.fromList l2

相反,如果列表确实像示例中那样排序,则其他方法也是可能的。举个例子,如果l1was 与上面相同,但是l2was ['d', {-whatever-}],那么你就会知道输出是空的。