获取没有递归的列表列表

时间:2011-10-20 15:57:21

标签: haskell

我正在尝试从字母[0..9]中获取长度为4的所有列表,其中包含唯一元素。

allNumbers = [a | let list = [0..9], x1 <- list, x2 <- list, x3 <- list, x4 <- list, let a = [x1,x2,x3,x4], nub a == a]

我怎样才能得到一些最简单,最好的版本?如果我需要所有长度为10的列表(我不想将x#&lt; - 列表10次复制),该怎么办?鼓励非递归回答。

1 个答案:

答案 0 :(得分:3)

使用sequence

Prelude> let a = [0..9]
Prelude> sequence $ replicate 4 a

这依赖于列表的monad实例。 然后,您可以使用nub添加filter部分:

filter (\x -> nub x == x) $ sequence $ replicate 4 [0 .. 9]

更新:正如评论中指出的那样,你也可以使用replicateM(我不知道):

Prelude> :m + Control.Monad
Prelude> filter (\x -> nub x == x) $ replicateM 4 [0 .. 9]