找到这两组物品的所有可能组合的聪明方法是什么?

chi*_*ro2 6 haskell

假设我有两种物品

data Item1 = A | B | C
data Item2 = D | E | F
Run Code Online (Sandbox Code Playgroud)

两套

set1 = [A,B,C]
set2 = [D,E,F]
Run Code Online (Sandbox Code Playgroud)

我想找到所有独特的方法来匹配两组中的项目,答案应该是(非正式表示法):

AD,BE,CF
AD,BF,CE
AE,BD,CF
AE,BF,CD
AF,BD,CE
AF,BE,CD
Run Code Online (Sandbox Code Playgroud)

换句话说,我想要一些功能来完成以下任务:

combine :: [Item1] -> [Item2] -> [[(Item1,Item2)]]
combine = undefined
Run Code Online (Sandbox Code Playgroud)

注意每个组合应该是一个元组,上面的枚举方案中的每一行都应该是一个列表,例如:

[(A,D),(B,E),(C,F)]
Run Code Online (Sandbox Code Playgroud)

ran*_*ame 7

用这个

import Data.List (sort, permutations)
combine as bs = zipWith zip (repeat as) (sort $ permutations bs)
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,值得注意的是,这个解决方案的所有聪明之处都来自于"排列".特别是,认识到你的匹配问题只是输入的一个排列(输出的一个子集),因此你想要所有的'n!'排列. (5认同)