HaskellのStream Fusionとは何ですか?
ローガンが指摘する論文は素晴らしいですが、それは少し難しいです。 (ちょうど私の学生に聞いてください。)また、「ストリームフュージョンの仕組み」と「ストリームフュージョンとは何か、それをどのように使用するか」についてはほんの一部です。
ストリームフュージョンが解決する問題は、記述された機能コードが中間リストを割り当てることが多いことです。たとえば、ノード番号の無限リストを作成するために、
nodenames = map ("n"++) $ map show [1..]
単純なコードは、整数の無限リスト[1, 2, 3, ...]
、文字列の無限リスト["1", "2", "3", ...]
、最終的には名前の無限リスト["n1", "n2", "n3", ...]
を割り当てます。割り当てが多すぎます。
ストリームフュージョンが行うことは、nodenames
のような定義を、結果に必要なものだけを割り当てる再帰関数を使用するものに変換することです。一般に、中間リストの割り当てをなくすことはdeforestationと呼ばれます。
ストリームフュージョンを使用するには、 GHCチケットで説明されている)ストリームフュージョンライブラリの関数を使用する非再帰的なリスト関数を記述する必要があります。 915 (map
、foldr
など)明示的な再帰の代わりに。このライブラリには、ストリームの融合を利用するために書き直されたすべてのPrelude関数の新しいバージョンが含まれています。どうやらこれは次のGHCリリース(6.12)になる予定ですが、現在の安定バージョン(6.10)にはありません。ライブラリを使用する場合は、Porgesの回答に簡単な説明があります。
ストリームフュージョンがどのように機能するかについての説明が実際に必要な場合は、別の質問を投稿してください。
私の知る限り、ノーマンの発言とは異なり、ストリームフュージョンは現在notGHCのベースに実装されています(つまり、プレリュード関数を使用することはできません) )。詳細については、「 GHCチケット915 」を参照してください。
ストリームフュージョンを使用するには、ストリームフュージョンライブラリをインストールし、Data.List.Stream(Control.Monad.Streamをインポートすることもできます)をインポートし、Prelude関数ではなく、そのモジュールの関数のみを使用する必要があります。これは、すべてのデフォルトリスト関数を非表示にして、[x..y]構成またはリスト内包を使用せずにPreludeをインポートすることを意味します。