将两个嵌套列表组合为一个嵌套列表

时间:2017-12-27 17:07:43

标签: haskell

我想结合两个列表列表并获得一个新的嵌套列表,这是我的代码:

getAllPaths ::(Eq a) => [(a,a)] -> [[a]]
getAllPaths [] = [[]]
getAllPaths (x:xs) = findAllPath (fst x) xs ++ getAllPaths xs

我想将findAllPath返回的嵌套列表与递归调用中的所有元素组合在一起,这些元素也是嵌套列表。

我知道++用于组合两个列表而没有嵌套列表,但我也不能使用第一个concat然后++因为然后列表将被展平。

以下是findAllPath的类型签名和函数:

   findAllPath ::(Eq a) => a -> [(a,a)] -> [[a]]
   findAllPath val list = path val list
            where
                (first,second) = partition((==val).fst) list
                singl = map snd first
                path val list
                            | first == [] = [[val]]
                            | otherwise = map ((:) val) $ concat $ map (\x -> findAllPath x list) singl

此函数返回一个节点的所有可能路径。我想从所有节点收集所有可能的路径。

例如,节点1和2的路径很少,如下所示:

从节点1[[1,2,3],[1,4,6]]

从节点2[[2,7,9],[2,0,6]]]

我想要[[1,2,3],[1,4,6],[2,7,9],[2,0,6]]

的组合

有人可以告诉我它如何在递归调用中将它们结合起来吗?

1 个答案:

答案 0 :(得分:2)

在评论中提及WillemVanOnsem时,您正在寻找(++)。从类型签名可能不会立即明显,但请考虑:

(++) :: [a] -> [a] -> [a]
-- if a ~ [b] then the specific type is:
(++) :: [[b]] -> [[b]] -> [[b]]

通过实验:

GHCi, version 8.2.1: http://www.haskell.org/ghc/  :? for help
Prelude> [[1,2,3],[1,4,6]] ++ [[2,7,9],[2,0,6]]
[[1,2,3],[1,4,6],[2,7,9],[2,0,6]]

如果您有完整的清单,可以与foldr结合使用。

foldr (++) [] (results :: [[[a]]])

或确实concat

concat (results :: [[[a]]])