代码之家  ›  专栏  ›  技术社区  ›  UofAStudent

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

  •  0
  • UofAStudent  · 技术社区  · 7 年前

    假设我有一个嵌套列表

    [1,2,3]
    

    当我使用数据时。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 回复  |  直到 7 年前
        1
  •  2
  •   willeM_ Van Onsem    7 年前

    虽然在置换层次上这样做可能更有效,但我们可以简单地首先进行所有置换,然后 后期处理 这个,有一个 map ,因此:

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