我注意到这在Haskell中是不合法的:
foo :: [a] -> [a]
foo [] = []
bar = 3
foo (x:xs) = x : foo xs
Run Code Online (Sandbox Code Playgroud)
但是,这是:
foo :: [a] -> [a]
bar = 3
foo [] = []
foo (x:xs) = x : foo xs
Run Code Online (Sandbox Code Playgroud)
虽然函数匹配的模式必须全部组合在一起,但类型签名似乎可以漂移.但到目前为止?我被告知它必须处于相同的"块"......但从技术上讲,究竟什么是"块"?
给定x所有子列表具有相同长度的长度列表列表y,输出包含每个子列表中的一个项目y^x的长度x列表.
示例(x = 3,y = 2):
[ [1, 2], [3, 4], [5, 6] ]
Run Code Online (Sandbox Code Playgroud)
输出(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] ]
Run Code Online (Sandbox Code Playgroud)
红宝石
我编写了实际代码来执行此任务,但在Ruby中,因为它是我最熟悉的语言.
def all_combinations(lst)
lst.inject {|acc, new| acc.product(new).map(&:flatten) }
end
Run Code Online (Sandbox Code Playgroud)
类型
输入是包含类型a的项的列表列表,输出也是如此.
allProduct :: [[a]] -> [[a]]
Run Code Online (Sandbox Code Playgroud)
笛卡尔积,扁平化和折叠
看看我的Ruby解决方案让我觉得充分利用这些功能可能足以解决问题.问题是虽然笛卡尔积输出了一个元组列表,但我需要一个列表列表.