【发布时间】:2015-12-05 05:13:21
【问题描述】:
给定一个长度为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,因为它是我最熟悉的语言。
def all_combinations(lst)
lst.inject {|acc, new| acc.product(new).map(&:flatten) }
end
类型
输入是包含 a 类型项目的列表列表,输出也是。
allProduct :: [[a]] -> [[a]]
笛卡尔积,展平和折叠
查看我的 Ruby 解决方案让我觉得好好利用这些功能可能足以解决问题。问题是虽然笛卡尔积输出了一个元组列表,但我需要一个列表列表。
【问题讨论】:
-
allProduct = sequence. -
@Zeta 但 Hoogle 说类型是
sequence :: Monad m => [m a] -> m [a]而我需要[[a]] -> [[a]] -
m是列表类型构造函数 ([]),在这种情况下。如果需要,您可以随时使allProduct的类型更具体:allProduct = sequence :: [[a]] -> [[a]]。 -
你尝试了什么?搜索
[[a]] -> [[a]]会返回匹配sequence。 -
[[a]]比m [a]和[m a]更具体,因为m(在sequence的类型签名中)代表any monad,但是[]只是Monad的一个实例。
标签: haskell functional-programming combinatorics cartesian-product