给定一个列表,其中包含长度为x
的多个子列表,所有子列表的长度都相同,为y
,输出包含每个子列表中一项的x
个项目的y^x
个列表。
例如(x=3
,y=2
):
[ [1, 2], [3, 4], [5, 6] ]
输出(2^3 == 8
种不同的输出):
[ [1, 3, 5], [1, 4, 5], [1, 3, 6], [1, 4, 6],
[2, 3, 5], [2, 4, 5], [2, 3, 6], [2, 4, 6] ]
我的研究/工作
Ruby
我用Ruby撰写了实际代码来执行此任务,因为这是我最熟悉的语言。
def all_combinations(lst)
lst.inject {|acc, new| acc.product(new).map(&:flatten) }
end
类型
输入是一个包含类型为a的项目的列表,输出也是如此。
allProduct :: [[a]] -> [[a]]
笛卡尔积、扁平化和折叠
看着我的 Ruby 解决方案,我认为这些函数的好处足以解决问题。问题在于,虽然笛卡尔积输出了一个元组列表,但我需要一个列表的列表。
m
是列表类型的构造器 ([]
),在这种情况下。如果需要,您可以始终使allProduct
的类型更加具体化:allProduct = sequence :: [[a]] -> [[a]]
。 - jub0bs[[a]] -> [[a]]
时,返回了sequence
的结果。 - jub0bs[[a]]
比m [a]
和[m a]
更加具体,因为在sequence
类型签名中,m
代表任意的monad,但[]
仅仅是Monad
的一个实例。 - jub0bs