2016-09-03 10 views
0

リストがある場合[a,b,c,d,e]どのようにして、要素をサブリストに結合して順序を維持するかを見つける方法を教えてください。Haskell:リストに参加するさまざまな方法

出力はこの

[ [[a], [b], [c], [d]] 
, [[a,b], [c], [d]] 
, [[a], [b,c], [d]] 
, [[a], [b], [c,d]] 
, [[a,b,c], [d]] 
, [[a,b], [c,d]] 
, [[a,b,c,d]] 
] 

答えて

2

ようになるはずですあなたはこのようにそれを行うことができます。

sublists :: [a] -> [[[a]]] 
sublists [x] = [[[x]]] 
sublists (x:xs) = sublists xs >>= \(y:ys) -> [[x]:y:ys, (x:y):ys] 

ここでの主な洞察は、空のリスト入力にこれを拡張する論理的な方法がないことです - 実行可能な唯一の候補はsublists [] = [[[]]]でしたが、空のリストが導入されています(この場合は不要です)。

しかし、これは便利な不変の動機:インナーインナー(最も内側の)リストが空になることはありません(と、私たちは、これが[[x]:y:ys, (x:y):ys]で空のリストを導入しないことにより、ケースのままを確認してください - 私たちは[x]で新しいリストを追加唯一の時間彼らはすでに要素を持っています)。これにより、ラムダでのパターンマッチングが確実に失敗することはありません。代わりに(>>=)

sublists :: [a] -> [[[a]]] 
sublists' [x] = [[[x]]] 
sublists' (x:xs) = do 
    (y:ys) <- sublists' xs 
    [[x]:y:ys, (x:y):ys] 

またはconcatMap

sublists'' :: [a] -> [[[a]]] 
sublists'' [x] = [[[x]]] 
sublists'' (x:xs) = concatMap (\(y:ys) -> [[x]:y:ys, (x:y):ys]) (sublists'' xs) 
+1

ありがとうございました!それはどんな明確である場合はさておき、これは自明の表記を行う使用して書き換えることができるように


それはうまくいく。故障/説明のチャンス? – matthias

+1

空のリストには賢明な答えがありますが、[[[]]] 'それはそうではありません。パーティションのコンポーネントは空であってはいけませんが、パーティションには最初の場所に要素がない場合のコンポーネントはありません。 – pigworker

関連する問題