2017-04-08 20 views
1

我想生成给定字母表中的所有单词。例如:生成字母表中的所有单词

['a', 'b'] -> ["","a","b","aa","ba","ab","bb","aaa","baa","aba","bba","aab" ...] 

我管理由现在实现这个功能:

myfunc :: [a] -> [[[a]]] 
myfunc l = iterate fromList $ map (\x -> x : []) l 
    where 
    fromList ls = [y : ys | y <- l, ys <- ls] 

但这个函数不正确产生的结果。我希望答案是一个字符串,例如只有前5个元素 - >["","a","b","aa","ba"]。任何帮助如何做到这一点?

+0

@melpomene:我认为OP并不意味着子列表。他们想要生成*所有*可能的序列,其中包含字母'“ab”'。 –

+0

是的..我的错误对不起..我改变了文本 – JoeDonald

回答

4

根据你的榜样,你做生成子列表:你产生序列从给定的字母串l

此外,myfunc的签名应该是[a] -> [[a]]。确实列表中的元素也是字符串,所以[a] s。

您可以使用递归列表理解为:

myfunc :: [a] -> [[a]] 
myfunc l = []:[(x:ys) | ys <- myfunc l, x <- l] 

产生:

*Main> take 10 $ myfunc "ab" 
["","a","b","aa","ba","ab","bb","aaa","baa","aba"] 

代码的工作原理如下,我们发出的第一个元素是空字符串([]部分在[]:...)。所以这将是我们发出的第一个结果(也是递归结果中的第一个结果)。

现在在列表理解部分,我们遍历的myfunc l(所以首先ys是空列表)中的所有元素,我们前置一个元素与字母(ab)的所有字符。接下来ys将会是[a],所以我们在此前加上了alpabeth的字符,依此类推。

+1

我没有看到...感谢您的帮助和解决方案。 – JoeDonald

相关问题