a
のリストとのリストを取得し、b
すべてのペアリング [(a, b)] を返すように設計された次のコードがあります。
- それぞれは
a
、b
各ペアリングで 1 回だけ表示されます。 - 各ペアは、いくつかの条件を
(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]