我想生成给定字母表中的所有单词。例如:
['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"]
。有什么帮助怎么做?
答案 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中,依此类推。