部分パスリストの前に新しいラベルを追加し、出力用にそれらを逆にすることで、パスを作成します。
listtree tree = map reverse $ traverse [] tree
where traverse path (Node label []) = [label:path]
traverse path (Node label xs) = concat $ map (traverse (label:path)) xs
リストの最後ではなく先頭にラベルを追加する理由は、追加には時間と割り当てられたメモリにO(N)がかかり、ヘッドの追加にはO(1)がかかるためです。もちろん、リストの反転もO(N)ですが、反転はリストごとに1回だけ実行されます...
したがって、上記の「頭に追加し、必要に応じて逆にする」パターンは、機能的なアルゴリズムやデータ構造を使用する場合に広く使用されているイディオムです。
編集:@luquiのコメントから、パスを取得するための補完的な方法は、パスを下から上に構築することです。
listtree (Node label []) = [[label]]
listtree (Node label xs) = map (label:) $ concat $ map listtree xs
これは私のソリューションよりも短く(そしておそらくより明確で)、パスを希望の順序で提供するという追加の利点があります。パスはルートではなくリーフから開始されます。
(前のソリューションと同様に)パスリストは、リストの最後に追加するのではなく、リストの最初にヘッドを追加することによって拡張されることに注意してください。