我試圖在Haskell中實現一個列表的排列。排列的想法是這樣的:Haskell中的排列實現
基本情況是當列表長度爲0和1時,它是列表本身,當大小爲2時,排列給出列表本身以及交換元素。
現在,給出一個列表[a,b,c,d]我們排列[b,c,d]並附加一個。並且我們改變我們的列表,使其在第一個b中像[b,a,c,d]和遞歸地排列[a,c,d]等等。
到目前爲止,我在Haskell中完成了以下代碼。這完美的作品。但我對這包含的'haskell-ness'的級別不滿意。我想提供一些關於如何在Haskell中更加可讀和高效的提示。提前致謝。代碼如下:
-- swap the first element of a list with the element at the index
swapFirstWith index l | index == 0 = l
| otherwise = [l!!index]
++ (take (index-1) (tail l))
++ [head l]
++ (drop (index+1) l)
permutations :: [a] -> [[a]]
permutations [] = [[]]
permutations [a] = [[a]]
permutations [a,b] = [[a,b], [b,a]]
permutations lst = foldl (++) [] (map (\x-> miniperms x) swappedList)
where miniperms l = map (\x-> (head l): x) $ permutations (tail l)
swappedList = map (\(i, x) -> swapFirstWith i lst) (zip [0..] lst)
main = do
putStrLn $ show $ perms
putStrLn $ show $ length perms
where lst = [1,2,3,4,5,6,7,8,9]
perms = permutations lst
你可以看一下[base in implementation](http://hackage.haskell.org/package/base-4.10.0.0/docs/src/Data.OldList.html#permutations),它有很好的討論[這個問題和答案](https://stackoverflow.com/questions/24484348)。 – Cirdec