Haskell の 9 つの要素のリストから 4 つの要素のすべての順列を選択する効果的な方法を見つけることができません。同じことを行うpython-way:
itertools.permutations(range(9+1),4)
Haskell でそれを行うにはあまり効果的ではない方法:
nub . (map (take 4)) . permutations $ [1..9]
次のようなものを見つけたい:
permutations 4 [1..9]
Haskell の 9 つの要素のリストから 4 つの要素のすべての順列を選択する効果的な方法を見つけることができません。同じことを行うpython-way:
itertools.permutations(range(9+1),4)
Haskell でそれを行うにはあまり効果的ではない方法:
nub . (map (take 4)) . permutations $ [1..9]
次のようなものを見つけたい:
permutations 4 [1..9]
これが私の解決策です:
import Control.Arrow
select :: [a] -> [(a, [a])]
select [] = []
select (x:xs) = (x, xs) : map (second (x:)) (select xs)
perms :: Int -> [a] -> [[a]]
perms 0 _ = [[]]
perms n xs = do
(y, ys) <- select xs
fmap (y:) (perms (n - 1) ys)
非常に怠惰で、無限リストでも機能しますが、出力はあまり役に立ちません。対角化などの実装は気にしませんでした。有限リストの場合は問題ありません。
pick :: Int -> [a] -> [[a]]
pick 0 _ = [[]]
pick _ [] = []
pick n (x : xs) = map (x :) (pick (n - 1) xs) ++ pick n xs
perms :: Int -> [a] -> [[a]]
perms n l = pick n l >>= permutations
replicateM 4 [1..9]
あなたのためにこれをしてくれると思います。ですControl.Monad
。
これはどう
import Data.List (delete)
perms :: (Eq a) => Int -> [a] -> [[a]]
perms 0 _ = [[]]
perms _ [] = [[]]
perms n xs = [ (x:ys) | x <- xs, ys <- perms (n-1) (delete x xs) ]
基本的に、セットからの n 要素の順列は、結果の最初の要素として任意の要素を選択し、残りは残りのセットからの n-1 要素の順列です。さらに、いくつかの基本ケース。リスト内の要素が一意であると想定します。