列表理解项的动态数量

时间:2016-01-26 22:00:07

标签: haskell

我试图在列表中获取可变数量的字符串的排列。我确信这在Haskell中是可行的,我只是很难找到这个的参考,

我希望能够做到[ [n1] ++ [n2] ++ etc | n1 <- {first string}, n2 <- {second string}, etc ]

我的列表可能是["hey", "now"]

我的输出看起来像这样:

["hn","ho","hw","en","eo","ew","yn","yo","yw"]

我该怎么做呢?

2 个答案:

答案 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的字符串,但会显示列表理解的贬值(因为returnconcatfmap为{ {1}},如果我记得的话。)

这是一种蛮力的方式(如果你想知道一种可行的方法)。如果您不喜欢干净版,请参阅chi's answer

map应该这样做。列表推导可能有更好的方法,但这也可以完成工作。

说明:

concat $ map (\char1 -> map (\char2 -> char1:[char2]) string2) string1