ハスケルの2次元グリッドに関する最近の質問からインスピレーションを得て、2次元ジッパーを作成してリストのリスト内の位置を追跡することが可能かどうか疑問に思っています。リスト上の1次元ジッパーは、私たちが本当に効率的に大きなリストでローカルに移動できるようにします(一般的な例はテキストエディターです)。2次元ジッパー
grid =
[[ 1, 2, 3, 4, 5]
,[ 6, 7, 8, 9,10]
,[11,12,13,14,15]
,[16,17,18,19,20]
,[21,22,23,24,25]]
は、我々は効率的にだけでなく、左と右が、アップして、ここで、グリッド内の下に移動するジッパーデータ構造のいくつかの種類を作成することができます。しかし、我々はこのような二次元を持っていると言うことができますか?そうであれば、リストのリストを無限リストの無限リストで置き換えると、効率的な動きを得ることができますか?
「ジッパーがどのように動作するかの重要な側面の一つは、彼らはそれに到達するために使用されているパスによって構造内の位置を表していることです」。ユニークなパスをジッパーの重要な要件としているのはなぜですか?私は、データ構造内の "場所"を表すどんな方法でも十分であると考えていたでしょう。 –
@AnupamJain:再構築に使用されたフラグメントは元の不変構造の一部であるため、あなたがそれを再構築するとき、そのパスはまだ元の値を持ちます。それを処理する唯一の方法は、両方のパスを歩き回り、両方の交換を行うことです。つまり、両方のパスを「一意の」パスとみなします。 –
@AnupamJain:可能な冗長パスが多いほど、非効率性が増します。最悪のシナリオはサイクリックリストのようなもので、無限のパスがあり、各パスに構造全体が含まれているため、すべてを再構築する必要があります。 –