我们说我有一个嵌套列表
[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)
如果有更好的方法通过使用置换函数来处理这个问题而不置换零,那么我们将非常感激。
答案 0 :(得分:2)
虽然在排列级别执行此操作可能更有效,但我们可以先执行所有排列,然后使用map
post process ,所以:< / p>
import Data.List(permutations)
our_perm :: Num a => [a] -> [[a]]
our_perm = map (++[0]) . permutations