3

Haskell の 9 つの要素のリストから 4 つの要素のすべての順列を選択する効果的な方法を見つけることができません。同じことを行うpython-way:

itertools.permutations(range(9+1),4)

Haskell でそれを行うにはあまり効果的ではない方法:

nub . (map (take 4)) . permutations $ [1..9]

次のようなものを見つけたい:

permutations 4 [1..9]
4

4 に答える 4

5

これが私の解決策です:

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)

非常に怠惰で、無限リストでも機能しますが、出力はあまり役に立ちません。対角化などの実装は気にしませんでした。有限リストの場合は問題ありません。

于 2012-08-01T20:06:22.493 に答える
2
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
于 2012-08-02T09:25:53.900 に答える
1
replicateM 4 [1..9]

あなたのためにこれをしてくれると思います。ですControl.Monad

于 2012-08-01T21:24:27.473 に答える
0

これはどう

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 要素の順列です。さらに、いくつかの基本ケース。リスト内の要素が一意であると想定します。

于 2012-08-01T23:51:37.810 に答える