問題タブ [comonad]
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.
scala - Zipper が Comonad である理由を理解する
これは、私の前の質問に対する回答のフォローアップです。
の各項目を関数でマップし、生成する必要がa:AあるとList[A]します。b:Bdef f(a:A, leftNeighbors:List[A]): BList[B]
明らかにmap、リストを呼び出すことはできませんが、リストジッパーを使用することはできます。ジッパーは、リスト内を移動するためのカーソルです。現在の要素 ( focus) とその隣接要素へのアクセスを提供します。
fこれで、 myを に置き換えて、def f'(z:Zipper[A]):B = f(z.focus, z.left)この新しい関数f'をcobindメソッド ofに渡すことができZipper[A]ます。
動作は次のcobindようになります: ジッパーでそれを呼び出し、次にジッパーを移動し、新しいf'「移動した」ジッパーで呼び出し、再びジッパーを移動する、というように... ジッパーがリストの最後に到達するまで。 f'
最後に、cobindはタイプ の新しいジッパーを返しますZipper[B]。これはリストに変換できるため、問題は解決されます。
ここで、cobind[A](f:Zipper[A] => B):Zipper[B]との間のbind[A](f:A => List[B]):List[B]対称性に注意してください。ListMonadZipperComonad
それは理にかなっていますか?
haskell - 「インターリーブ準同型」の概念は本当ですか?
次のクラスの関数が必要です。
明らかに、私が発明した名前は、いかなる意味でも正式な用語ではなく、上記の型クラスはあまりエレガントではありません。これは名前を持つ概念ですか、それともいくつかのライブラリで実装されていますか? これを行うためのより合理的な方法はありますか?
この関数の目的は、fいくつかのデータに注釈を付けるコンテキストがあることです (この質問のためのランダムなデータ構造の例です) Foo:Bar
ポリモーフィックな方法でデータのコンテキストを変換したいと思います。コンテキスト間の準同型性のみを知っており、(必然的に) データ自体を気にする必要はありません。これは、上記の例ではinstance InterleavedHomomorphic Fooandを指定することで実行できます。instance InterleavedHomomorphic Bar
haskell - state モナドと costate comonad の結合
state モナドS -> (A, S)と costate comonadを組み合わせるには(E->A, E)?
両方の明白な組み合わせを試してみましS -> ((E->A, E), S)たが、どちらの場合も、組み合わせの操作 ( 、、... など)(E->S->(A, S), E)を定義する方法がわかりません。returnextract
haskell - なぜ IO は共通モナドではなくモナドなのですか?
出力は効果的な計算です。したがって、それをモナドにカプセル化することは理にかなっています。しかし、入力は状況依存の計算です。したがって、それをコモナドにカプセル化する方が理にかなっています。
しかし、Haskell では入力と出力の両方がIOモナドにカプセル化されています。なんで?
haskell - バイナリ ツリー ジッパーを Comonad のインスタンスにする方法は?
バイナリ ツリー ジッパーを comonad のインスタンスにしたいのですが、duplicate適切に実装する方法がわかりません。
これが私の試みです:
いくつかの説明:
BinTree aはバイナリ ツリー データ型で、各ツリー ノードにはラベルが含まれます。Partial a左または右の部分木を持つ二分木です。私のコードのスタックはPartial a、データ コンテキストの役割を果たします。BTZBinTreeのインスタンスを作成したいジッパーを表しComonad、データ コンテキストとフォーカス サブツリーで構成されます。
のインスタンスにするためにComonad、私の計画は と を実装extractしduplicate、いくつかのランダムなバイナリ ツリーを取得して、コモナド プロパティが保持されるかどうかを検証することです。
これextractは簡単で、フォーカス サブツリーを取り出すだけです。
関数dupは、各ノード ラベルをそのノードに焦点を当てたツリー ジッパーに置き換える補助関数として機能します。
の場合duplicate z、ノード ラベルはzそれ自体である必要がありextract . duplicate == idます。非リーフ ノードのdup場合、親がいないかのようにサブツリーを処理し、現在のフォーカスzと残りのデータ コンテキストが後でこれらのジッパーに追加されます。
これまでのところ、最初の 2 つの comonad プロパティ (extract . duplicate = idおよびfmap extract . duplicate) は満たされていますが、データ コンテキストをどうするかはわかりません。私が現在していることは、ジッパーを取り、z上げ続けることです. 途中で、各データ コンテキスト スタックのトップを取得して新しいデータ コンテキスト スタックを構築します。これは正しいように聞こえますが、正しい型 ([Partial (BTZ a)]です。しかし、私のアプローチでは第 3 法則を満たすことはできません。
上記のバイナリ ツリー ジッパーのデータ型定義を考えると、それを Comonad のインスタンスにすることは可能ですか? 答えが「はい」の場合、私のアプローチに何か問題がありますか?