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

合并Haskell中的两个列表

  •  21
  • bogatyrjov  · 技术社区  · 15 年前

    无法确定如何合并两个列表 以下列方式 哈斯克尔:

    INPUT:  [1,2,3,4,5] [11,12,13,14]
    
    OUTPUT: [1,11,2,12,3,13,4,14,5]
    
    6 回复  |  直到 10 年前
        1
  •  42
  •   andri    15 年前
    merge :: [a] -> [a] -> [a]
    merge xs     []     = xs
    merge []     ys     = ys
    merge (x:xs) (y:ys) = x : y : merge xs ys
    
        2
  •  53
  •   Community Mohan Dere    8 年前

    我想提出一个更懒惰的合并版本:

    merge [] ys = ys
    merge (x:xs) ys = x:merge ys xs
    

    例如,您可以查看最近的一个关于 lazy generation of combinations .
    接受答案的版本在第二个论点中是不必要的严格,这就是这里所改进的。

        3
  •  23
  •   Ed'ka    15 年前

    所以你为什么这么简单(concat.转置)“不够漂亮”?我想你尝试过这样的方法:

    merge :: [[a]] -> [a]
    merge = concat . transpose
    
    merge2 :: [a] -> [a] -> [a]
    merge2 l r = merge [l,r]
    

    因此,您可以避免显式递归(与第一个答案相比),但它仍然比第二个答案简单。那么缺点是什么呢?

        4
  •  6
  •   danlei    15 年前

    编辑:看看艾德卡的回答和评论!

    另一种可能性:

    merge xs ys = concatMap (\(x,y) -> [x,y]) (zip xs ys)
    

    或者,如果你喜欢实用的:

    merge xs ys = concat $ getZipList $ (\x y -> [x,y]) <$> ZipList xs <*> ZipList ys
    
        5
  •  4
  •   dfeuer    10 年前

    当然,这是一个展开的案例:

    interleave :: [a] -> [a] -> [a]
    interleave = curry $ unfoldr g
      where
        g ([], [])   = Nothing
        g ([], (y:ys)) = Just (y, (ys, []))
        g (x:xs, ys) = Just (x, (ys, xs))
    
        6
  •  -2
  •   Cody Gray Felix    13 年前
    -- ++
    pp [] [] = []
    pp [] (h:t) = h:pp [] t
    pp (h:t) [] = h:pp t []
    pp (h:t) (a:b) = h : pp t (a:b)
    
    推荐文章