使用功能(使用內部列表理解),我的解決辦法是
combinations :: [[a]] -> [[a]]
combinations [] = []
combinations [l] = map (\ x -> [x]) l
combinations (x:xs) = combine (combinations [x]) (combinations xs)
where combine a b = [ p ++ q | p <- a, q <- b ]
例子:
*Main> combinations [[1, 2, 3], [4, 5, 6]]
[[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]]
*Main> combinations [['a', 'b', 'c'], ['A', 'B', 'C'], ['1', '2']]
["aA1","aA2","aB1","aB2","aC1","aC2","bA1","bA2","bB1",...
"bB2","bC1","bC2","cA1","cA2","cB1","cB2","cC1","cC2"]
編輯:當然你可以使用sequence
功能,在評論中提出:
*Main> sequence [['a', 'b', 'c'], ['A', 'B', 'C'], ['1', '2']]
["aA1","aA2","aB1","aB2","aC1","aC2","bA1","bA2","bB1",...
"bB2","bC1","bC2","cA1","cA2","cB1","cB2","cC1","cC2"]
你堅持使用列表理解來做它嗎?我認爲對於這樣的任務來說,功能更好,更清潔。 – zegkljan 2014-11-25 10:15:53
@JanŽegklitz感謝您的評論。這並不是說我堅持這樣做:我只是覺得用一個列表理解來寫一個好的,乾淨的方法,而且根本不知道這是否可行。 – Yosh 2014-11-25 10:19:13
你想要所有列表的笛卡爾積。使用'序列a'來實現這一點。 http://stackoverflow.com/questions/3387359/calculate-n-ary-cartesian-product – chi 2014-11-25 10:27:44