在Haskell中为嵌套列表的每个排列添加一个元素

时间:2018-03-17 20:29:23

标签: list haskell functional-programming nested-lists

我们说我有一个嵌套列表

[1,2,3]

当我使用Data.List模块置换此列表时,结果如下:

> permutations [1,2,3]
=> [[1,2,3],[2,1,3],[3,2,1],[2,3,1],[3,1,2],[1,3,2]]

但是我想这样,我在每个尾部的末尾连接一个0。例如:

=> [[1,2,3,0],[2,1,3,0],[3,2,1,0],[2,3,1,0],[3,1,2,0],[1,3,2,0]]

我认为这样做的唯一方法是将排列的源代码修改为不同的功能,但我不确定如何将连接合并到其中。这将是来源:

import Data.List

permutations            :: [a] -> [[a]]
permutations xs0        =  xs0 : perms xs0 []
  where
    perms []     _  = []
    perms (t:ts) is = foldr interleave (perms ts (t:is)) (permutations is)
      where interleave    xs     r = let (_,zs) = interleave' id xs r in zs
            interleave' _ []     r = (ts, r)
            interleave' f (y:ys) r = let (us,zs) = interleave' (f . (y:)) ys r
                                     in  (y:us, f (t:y:us) : zs)

如果有更好的方法通过使用置换函数来处理这个问题而不置换零,那么我们将非常感激。

1 个答案:

答案 0 :(得分:2)

虽然在排列级别执行此操作可能更有效,但我们可以先执行所有排列,然后使用map post process ,所以:< / p>

import Data.List(permutations)

our_perm :: Num a => [a] -> [[a]]
our_perm = map (++[0]) . permutations