假设我有一个字符串列表,如下所示:
["aesfa","gwopq","awefg"]
我想得到这些字符串之间所有可能的组合,比如这样:
["aga","agw","age","agf", ... ,"sga","sgw", ... , "aqf","aqg"]
列表中的字符串具有相同的长度,但可以是任何长度,并且列表可以包含不同数量的字符串
我尝试了以下列表综合:
-getCombinations (z:zs) = [x:y | x <- z, y <- zs]
很明显,这给了我第一个字符串的所有字符和其他字符串(而不是字符(之间的组合列表。
-getCombinations (z:zs) = [x:y | x <- z, y <- getCombinations zs]
如果我不为empy列表做模式匹配,这就不起作用,我是这样做的:
getCombinations [] = []
但这样做会使函数始终返回空列表,无论是什么
奇怪的是,如果我这样做了:
-getCombinations (z:zs) = [x:[y] | x <- z, y <- head zs]
它给了我前两个字符串之间的组合
我试图扩展它以获得另一个字符串,最终得到了这个:
getCombinations (z:zs) = [x:[y]++[w] | x <- z, y <- (head zs), w <- (head(tail zs))]
这给了我前三个字符串的组合
您实际上已经非常接近了。唯一的问题是空列表的情况:
getCombinations :: [[a]] -> [[a]]
getCombinations [] =[]-- ← empty list
getCombinations (z:zs) = [x:y | x <- z, y <- getCombinations zs]
如果你在这里返回空列表,那么这意味着getCombinations zs
最终将返回空列表。。。也将返回一个空列表。
如果你没有字符串,那么基本上有一个组合:空字符串,所以你应该返回:
getCombinations :: [[a]] -> [[a]]
getCombinations [] =[[]]-- singleton list with an empty string/list
getCombinations (z:zs) = [x:y | x <- z, y <- getCombinations zs]
实际上,您不需要自己实现getCombinations
。由于列表的Monad
实例,getCombinations
是sequence :: (Monad m, Traversable t) => t (m a) -> m (t a)
的特例:
Prelude> sequence ["aesfa","gwopq","awefg"]
["aga","agw","age","agf","agg","awa","aww","awe","awf","awg","aoa","aow","aoe","aof","aog","apa","apw","ape","apf","apg","aqa","aqw","aqe","aqf","aqg","ega","egw","ege","egf","egg","ewa","eww","ewe","ewf","ewg","eoa","eow","eoe","eof","eog","epa","epw","epe","epf","epg","eqa","eqw","eqe","eqf","eqg","sga","sgw","sge","sgf","sgg","swa","sww","swe","swf","swg","soa","sow","soe","sof","sog","spa","spw","spe","spf","spg","sqa","sqw","sqe","sqf","sqg","fga","fgw","fge","fgf","fgg","fwa","fww","fwe","fwf","fwg","foa","fow","foe","fof","fog","fpa","fpw","fpe","fpf","fpg","fqa","fqw","fqe","fqf","fqg","aga","agw","age","agf","agg","awa","aww","awe","awf","awg","aoa","aow","aoe","aof","aog","apa","apw","ape","apf","apg","aqa","aqw","aqe","aqf","aqg"]