【发布时间】:2013-10-10 15:55:54
【问题描述】:
我有以下代码,旨在获取 a 的列表和 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]
【问题讨论】:
-
[(a, b)]是对列表,因此您的函数返回的是对列表而不是对列表。 -
“每个 a 和每个 b 在每个配对中只出现一次” - 好吧,这可能是因为英语不是我的第一语言,但这对于任何一对(元组)来说都是如此(a ,b)? a 最多出现一次,b 最多出现一次。
-
你的目标不是很清楚。你想用折叠替换它还是问如何使
someFn更高阶?如果是后者,高阶就什么?cond谓词? -
foo x y with = filter (uncurry with) [(a,b) | a
-
我看到你正在处理第二个列表中的重复项,但是第一个呢?