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

Adding an element to each permutation of a nested list in Haskell

假设我有一个嵌套列表

[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)

如果有更好的方法通过使用置换函数而不置换零来解决这个问题,我们将不胜感激。

尽管在排列级别执行此操作可能更有效,但我们可以简单地先执行所有排列,然后 post 处理 map,所以:

import Data.List(permutations)

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