我有以下代码,它被设计为采用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)]'是成对的列表,所以你的函数返回一串成对列表而不是成对列表。 – duplode
“每个a和每个b只在每次配对中出现一次” - 嗯,这可能是因为英语不是我的第一语言,但这不是平凡的对于任何对(元组)(a,b)都是真的吗? a最多发生一次,b最多发生一次。 – Ingo
目标不明确。你想用折叠取代这个,还是你想问如何使'someFn'更高的顺序?如果后者,更高的顺序是什么? 'cond'谓词? – asm