生成字母表中的所有单词

时间:2017-04-08 11:35:03

标签: list haskell sequence

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

['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个元素 - &gt; ["","a","b","aa","ba"]。有什么帮助怎么做?

1 个答案:

答案 0 :(得分: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是空列表),并且我们在该元素前面加上字母表的所有字符({{1 }和a)。下一个b将为ys,因此我们将此前面的字母添加到alpabeth中,依此类推。