I\'m not able to find an effective way to pick out all permutations of 4 elements from a list of 9 elements in Haskell. The python-way to do the same thing:
Here is my solution:
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)
It's very lazy and even works for infinite lists, although the output there is not very useful. I didn't bother implementing diagonalization or something like that. For finite lists it's fine.
replicateM 4 [1..9]
Will do this for you, I believe. It's in Control.Monad
.
How about this
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) ]
Basically, it says, a permutation of n elements from a set is, pick any element as the first element of the result, then the rest is a permutation of n-1 elements from the rest of the set. Plus some base cases. Assumes that elements in the list are unique.
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