我有以下代码,旨在获取a
's 列表和 's 列表b
,并返回所有配对 [(a, b)],这样
- 每
a
一个b
在每对中只出现一次。 - 每对都
(a, b)
满足一些条件cond
,即cond :: a -> b -> Bool
。
例如,列表 [1, 2] [x,y,z] 的结果应该是
[[(1, x), (2, y)]
[(1, x), (2, z)]
[(1, y), (2, x)]
[(1, y), (2, z)]
[(1, z), (2, x)]
[(1, z), (2, y)]]
这是一些(有些抽象的)代码,它们通过显式递归来完成这项工作,但我想用折叠或类似的东西替换它。有小费吗?
someFn :: [a] -> [b] -> [ [(a, b)] ]
someFn [] _ = []
someFn (a : as) bs = [ [(a,b)] ++ rest | b <- bs, rest <- someFn as (bs \\ [b]), cond a b]