問題タブ [zipper]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
data-structures - Zipper データ構造とは何ですか?それを使用する必要がありますか?
質問は簡単です。Zipperのデータ構造を理解できません。
私の質問は、ツリーでの使用に関連しています。
ジッパーを使用してツリー ノードを変更する方法を知りたいです。そして、ツリー全体 (またはその大部分) をコピーしない方法。
ジッパーが間違っているかどうかを明確にしてください。多分それはツリーの更新に役立たないでしょうか?
または、ツリーを更新することは可能ですが、方法がわかりませんか?
haskell - Haskell:ジッパーの型クラスの作成
だから私はHaskell(そして他の関数型言語だと思います)のZipperパターンについて少し読んで、データ構造をトラバースして変更しました。これは私が型を作成するスキルを磨く良い機会になると思いましたHaskellのクラス。このクラスは、トラバースされるデータ構造に関係なく、コードを書き込むための共通のトラバーサルインターフェイスを提供できるためです。
おそらく2つのクラスが必要だと思いました。1つはルートデータ構造用で、もう1つは最初のクラスをトラバースするために作成された特別なデータ構造用です。
しかし、リストのようないくつかの単純なデータ構造でこれらを試したとき:
または二分木:
コンパイルできませんでした。Zippable
インスタンス定義ごとに、次のようなエラーがたくさん発生します。
だからここからどこへ行けばいいのかわからない。私の問題は、(Zipper z) =>
宣言z
がいずれかである必要があるときに、これら2つのインスタンスをバインドしようとしていることだと思いますZipper
。
xml - clojurexmlジッパーを使用して複数の値を返す
次のようなXMLがあるとします。
ここで、zip_filter / xml.cljのサンプルを調べて、関心のある単一の値を取得する方法を見つけました。
(ce)のテキスト値のペアのリストを返すようなことをどのように行うのか疑問に思っています。
編集:
ここにいくつかの動作するコードがありますが、それはかなり醜いです。些細なリファクタリングを求めていませんが、ジッパーがこれを行うためのより良い方法はありますか?
performance - ジッパーは実際にどの程度機能しますか? また、いつ使用する必要がありますか?
ジッパーは素晴らしいアイデアだと思います。リストまたはツリーをたどって、機能的な方法でローカル更新のように見えるものを作成する方法をエレガントに提供します。
漸近的に、コストは合理的であるように見えます。ただし、データ構造をトラバースするには、反復ごとにメモリを割り当てる必要があり、通常のリストまたはツリーのトラバーサルは単なるポインター追跡です。これは高価に思えます (間違っていたら訂正してください)。
コストは法外ですか?また、どのような状況でジッパーを使用するのが合理的でしょうか?
clojure - ノードを編集するためのclojure.zipによるポストオーダーツリートラバーサル
ネストされたベクトルとして表されるツリーがあります。indexed
このように各ノードのインデックスを表示して、ツリーの一般化を行いたいです。
ナイーブな実装はclojure.zipを直接使用します(すでにここで尋ねられているように)
ただし、を繰り返すとclojure.zip/next
、事前順序トラバーサルが実行され、この場合は無限ループになります(未訪問のノードは無限conj
に[:found]
ベクトルになります)。別のアプローチはを使用することclojure.walk/postwalk
ですが、インデックスなどの構造情報を提供しません。
これをどのように実装しますか?postorder-next
すぐに解決するforzipはありますか?
data-structures - 複数のカーソルを持つジッパーのようなデータ構造
Zipper データ構造は、ツリーをトラバースして現在の位置を維持したい場合に最適ですが、複数の位置を追跡したい場合はどのデータ構造を使用すればよいでしょうか?
例を挙げて説明しましょう:
- #haskell チャンネルの誰かが、yi エディターではカーソル位置を表すためにジッパーが使用されていると教えてくれました。これはすばらしいことですが、カーソルを 2 つにしたい場合はどうすればよいでしょうか。選択を表現したい場合と同様に、選択の開始と終了を知る必要があります。
- ウィキブックの Minotaur の例では、Zipper を使用して、迷宮内の Minotaur の位置を表しています。迷宮に敵を追加したい場合は、ジッパーで敵の位置を表すのが理にかなっています。
- 最後の 1 つは、すべてが始まった私のミニ プロジェクトからのものです。Haskell の学習の一環として、cairo と gth2hs を使用してツリー構造を視覚化しようとしています。ここまではうまくいきましたが、今度は 1 つまたは複数のノードを選択して、たとえば移動できるようにしたいと考えています。選択したノードが複数ある可能性があるため、教科書で定義されているように Zipper をそのまま使用することはできません。
hereで説明されているように、有限マップを含む XMonad の初期バージョンで使用されていたものと同様の、簡単な (単純な?) ソリューションがあります。
つまり、たとえば私のサンプル プロジェクトの場合、選択したノードをインデックス付きマップに格納し、メイン構造内のそれらの表現をインデックスに置き換えます。しかし、このソリューションには多くの欠点があります。上記のリンクで説明されているように、または私の例の場合、すべてのノードの選択を解除するには、ツリー全体を検索する必要があります。
scala - ネストされた構造を更新するためのよりクリーンな方法
次の2つのcase class
esがあるとします。
および次のPerson
クラスのインスタンス:
を更新したい場合zipCode
は、次のraj
ことを行う必要があります。
ネストのレベルが高くなると、これはさらに醜くなります。update-in
そのようなネストされた構造を更新するためのよりクリーンな方法(Clojureのようなもの)はありますか?
clojure - Clojure のジッパーで動作するようにツリーをフォーマットするにはどうすればよいですか?
遺伝的プログラミングの問題のために s 式のツリーを作成していますが、進化の過程でツリーの一部を変更する必要があります。完璧なClojureのジッパー機能に出会いましたが、私の人生では使い方がわかりません。
たとえば、ジッパーを作成するとします
これは、ルートに + があるツリーを表していると理解しています。次のようなものです。
ただし、私のジッパーはこれに同意しません。最初のノードを要求すると、(-> zipped zip/down zip/node)
(+
正しい) が返されますが、 に(-> zipped zip/down zip/down)
移動せず-
、代わりに が返されますnil
。確かに(-> zipped zip/down zip/rights)
、ツリーの残りの部分をルートの右側に兄弟として与えます。これは、ツリーがまったくないことを示唆しています。
ツリーを実行すると正しい答えが得られるため、ツリーを正しく表現していると確信しています。ジッパーは別のレイアウトを期待していますか?
functional-programming - Zipper ライブラリの make-node
独自のマップからジッパーを作成しようとしています。ジッパーの定義によると、
パラメータブランチ?そして子供たちは明確であり、私はそれを定義することができます. しかし、make-node 関数はややこしいです。使用されているとは思わない実装を行いました。
の地図を持っています
この地図からジッパーを作りたいです。だから私は次のジッパー関数呼び出しを使用しました、
これはうまくいきます。make-node パラメーターに nil を指定しても機能します。このパラメーターがいつどこで使用されるのかわかりません。