2017-04-08 12 views
1

与えられたアルファベットからすべての単語を生成したいと思います。たとえば:アルファベットからすべての単語を生成

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

しかし、この機能は正常に結果を生成しません:

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

は、私が今では、この機能を実装するために管理します。答えは、例えば最初の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"] 

コードは次のように、私たちが発する最初の要素が空の文字列([]がある作品[]:...の部分)。したがって、これが私たちが出す最初の結果になります(しかし、再帰的結果の最初の結果でもあります)。

は今リスト内包部に、我々は(その最初のysは空のリストです)myfunc lのすべての要素を反復処理し、我々はアルファベット(ab)のすべての文字とその要素を付加しました。次のys[a]となるので、アルファベットの文字の前に追加します。

+1

私はそれを見ませんでした...助けと解決のおかげで。 – JoeDonald

関連する問題