Haskell:多个字符串之间的所有组合



假设我有一个字符串列表,如下所示:

["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实例,getCombinationssequence :: (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"]

最新更新