2017-04-08 42 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

相關問題