在Haskell中合并类似的列表列表

时间:2016-01-23 14:19:41

标签: haskell functional-programming

我需要将多个列表与常用元素组合在一起。我应该在列表中做。

例如:

INPUT: [[1,2,3],[5,6],[8,3,11],[4,9,1]]

MY输出: [[1,2,3,8,3,11,1,2,3,4,9,1],[]]

需要输出: [[1,2,3,8,11,9],[5,6]]

另一个例子:

INPUT: [[4],[0],[7,10],[6],[6]]

MY输出: [[6,6],[]]

输出: [[4],[0],[7,10],[6]]

我的代码:

mergeAllLists :: [[Integer]] -> [[Integer]]
mergeAllLists (x:[]) = [x]
mergeAllLists (x:[]:y) = [x]
mergeAllLists (x:y:[]:_) = mergeOneToAll_ x [y]
mergeAllLists (x:xs) =  mergeAllLists (mergeOneToAll x xs)

mergeOneToAll :: [Integer] -> [[Integer]] -> [[Integer]]
mergeOneToAll _ [] = [[]]
mergeOneToAll list (y:list_of_list) = (mergeLists list y) : ( mergeOneToAll list list_of_list )

1 个答案:

答案 0 :(得分:2)

mergeAllLists :: [[Integer]] -> [[Integer]]
mergeAllLists = foldl mergeOneToAll []

mergeOneToAll :: [[Integer]] -> [Integer] -> [[Integer]]
mergeOneToAll [] xs = [xs]
mergeOneToAll (as:acc) xs =
  if null $ intersect xs as then
    as : mergeOneToAll acc xs
  else
    (as ++ xs) : acc

虽然效率不高(不是尾递归)。让我知道它是否需要更有效率,我会尝试改进它。