我试图在列表中获取可变数量的字符串的排列。我确信这在Haskell中是可行的,我只是很难找到这个的参考,
我希望能够做到[ [n1] ++ [n2] ++ etc | n1 <- {first string}, n2 <- {second string}, etc ]
我的列表可能是["hey", "now"]
我的输出看起来像这样:
["hn","ho","hw","en","eo","ew","yn","yo","yw"]
我该怎么做呢?
答案 0 :(得分:11)
> sequence ["hey", "now"]
["hn","ho","hw","en","eo","ew","yn","yo","yw"]
sequence
非常通用,但在列表中,您可以将其视为定义如下:
sequence :: [[a]] -> [[a]]
sequence [] = [[]]
sequence (x:xs) = [ y:ys | y <- x, ys <- sequence xs ]
以上结果有时被称为&#34;笛卡尔积&#34;列表列表,因为它类似于集合上的操作。
答案 1 :(得分:1)
编辑:这仅适用于长度为2的字符串,但会显示列表理解的贬值(因为return
为concat
而fmap
为{ {1}},如果我记得的话。)
这是一种蛮力的方式(如果你想知道一种可行的方法)。如果您不喜欢干净版,请参阅chi's answer。
map
应该这样做。列表推导可能有更好的方法,但这也可以完成工作。
说明:
concat $ map (\char1 -> map (\char2 -> char1:[char2]) string2) string1