我有以下代码,旨在接受一个
a
的列表和一个b
的列表,并返回所有配对 [(a, b)], 满足以下条件:
- 每个
a
和每个b
只在每个配对中出现一次。 - 每个配对
(a, b)
符合某个条件cond
,即cond :: a -> b -> Bool
。
[[(1, x), (2, y)]
[(1, x), (2, z)]
[(1, y), (2, x)]
[(1, y), (2, z)]
[(1, z), (2, x)]
[(1, z), (2, y)]]
这里有一些(有点抽象)的代码,使用显式递归实现了功能,但我想用fold或类似的东西来替换它。有什么建议吗?
someFn :: [a] -> [b] -> [ [(a, b)] ]
someFn [] _ = []
someFn (a : as) bs = [ [(a,b)] ++ rest | b <- bs, rest <- someFn as (bs \\ [b]), cond a b]