2011-10-20 50 views
3

我試圖從獨特元素的字母[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#< - 列表10次)?鼓勵非遞歸的答案。

回答

3

使用sequence

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

這依賴於對列表中的單子實例。 然後你可以用filternub部分添加:

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] 
+0

會有重複的結果嗎?如果是這樣,你不想要它們,添加'nubBy(\ x - > sort x == x)$ ...' –

+0

@trinithis - 好點,但我不確定OP想要什麼。 –

+6

'replicateM n =序列。 replicate n' –