2013-10-27 37 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 = [[]] 
相关问题