2013-10-27 36 views
0

我需要這樣的:生成具有不同量字符數的字符串數組在Haskell

[[i]++[j]| i <- ['a'..'d'], j <- ['a'..'d']] where I get the output: 
["aa","ab","ac","ad","ba","bb","bc","bd","ca","cb","cc","cd","da","db","dc","dd"] 

我需要的是產生這種輸出數組一個更動態的方式。因此,如果得到一個整數值3我應該是這樣的:

[[i]++[j]++[k]| i <- ['a'..'d'], j <- ['a'..'d'], k <- ['a'..'d'] 

回答

6
replicateM n ['a'..'d'] 

n是次重複次數。

+0

但讓我沒有得到我需要的排列。因此,如果我採取n = 5或者我做錯了什麼,那麼我只能得到輸出'[「abcd」,「abcd」,「abcd」,「abcd」,「abcd」]' – user2925688

+0

你正在寫'replicate',而不是'replicateM'。 –

+0

好吧,我的錯:)現在我寫了replicateM,但那裏擁抱編譯器說:錯誤 - 未定義變量「replicateM」 – user2925688

2

澄清路易·沃瑟曼的回答有點:

replicateM i m等同於:

do a1 <- m 
    a2 <- m 
    a3 <- m 
    ... 
    ai <- m 
    return [a1, a2, a3, ..., ai] 

例如,replicateM 3 getLine是一個IO [String]行動,將讓三條線,給你一個字符串列表:

do line1 <- getLine 
    line2 <- getLine 
    line3 <- getLine 
    return [line1, line2, line3] 

現在,請記住,列表解析只是花式語法[] Monad

[[i, j] | i <- ['a'..'d'], j <- ['a'..'d']] 

= 

do i <- ['a'..'d'] 
    j <- ['a'..'d'] 
    return [i, j] 

而這正是replicateM 2 ['a'..'d']的樣子。

+0

...和'replicate'(沒有'M')只需要一個項目並將其放入一個列表中。 – MathematicalOrchid

0

您可以使用下面的

seq i xs | i > 0 = [x:ys | x <- xs, ys <- seq (i-1) xs] 
     | otherwise = [[]] 
相關問題