我正在尝试从字母[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次复制),该怎么办?鼓励非递归回答。
答案 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]