Haskell で使用する二重接続エッジ リスト データ構造を実装したいと思います。このデータ構造は、平面内の線の配置のトポロジを管理するために使用され、面、エッジ、および頂点の構造が含まれています。
このデータ構造への優れたインターフェースは、次のArrangement
ような関数を備えた type としてのように思えます
overlay :: Arrangement -> Arrangement -> Arrangement
ただし、通常の実装は参照に大きく依存しています (たとえば、各面には隣接するエッジへの参照があります)。
これが機能する理想的な方法は、可変および不変の配列が行う方法に似ているように思えます。データ構造の内部はArrangement
機能的なデータ構造として実装されますが、配置を変更する操作はそれらを「解凍」して新しいものを作成しますモナド内の変更可能なインスタンス (理想的には COW マジックを使用して物事を効率化します)。
だから私の質問は:
(1) 配列の場合のように、小さなヒープをフリーズおよびアンフリーズする方法はありますか? (2)そうでない場合、より良いアプローチはありますか?