我想结合两个列表列表并获得一个新的嵌套列表,这是我的代码:
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]]
有人可以告诉我它如何在递归调用中将它们结合起来吗?
答案 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]]])