List all possible 4 chooses from 9 in Haskell

前端 未结 4 1997
温柔的废话
温柔的废话 2021-01-14 10:59

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:

         


        
4条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-01-14 11:20

    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.

提交回复
热议问题