問題タブ [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.

0 投票する
1 に答える
2876 参照

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

それは理にかなっていますか?

0 投票する
3 に答える
847 参照

haskell - 「インターリーブ準同型」の概念は本当ですか?

次のクラスの関数が必要です。

明らかに、私が発明した名前は、いかなる意味でも正式な用語ではなく、上記の型クラスはあまりエレガントではありません。これは名前を持つ概念ですか、それともいくつかのライブラリで実装されていますか? これを行うためのより合理的な方法はありますか?


この関数の目的は、fいくつかのデータに注釈を付けるコンテキストがあることです (この質問のためのランダムなデータ構造の例です) Foo:Bar

ポリモーフィックな方法でデータのコンテキストを変換したいと思います。コンテキスト間の準同型性のみを知っており、(必然的に) データ自体を気にする必要はありません。これは、上記の例ではinstance InterleavedHomomorphic Fooandを指定することで実行できます。instance InterleavedHomomorphic Bar

0 投票する
2 に答える
660 参照

haskell - state モナドと costate comonad の結合

state モナドS -> (A, S)と costate comonadを組み合わせるには(E->A, E)?

両方の明白な組み合わせを試してみましS -> ((E->A, E), S)たが、どちらの場合も、組み合わせの操作 ( 、、... など)(E->S->(A, S), E)を定義する方法がわかりません。returnextract

0 投票する
2 に答える
1211 参照

haskell - なぜ IO は共通モナドではなくモナドなのですか?

出力は効果的な計算です。したがって、それをモナドにカプセル化することは理にかなっています。しかし、入力は状況依存の計算です。したがって、それをコモナドにカプセル化する方が理にかなっています。

しかし、Haskell では入力と出力の両方がIOモナドにカプセル化されています。なんで?

0 投票する
1 に答える
2178 参照

haskell - バイナリ ツリー ジッパーを Comonad のインスタンスにする方法は?

バイナリ ツリー ジッパーを comonad のインスタンスにしたいのですが、duplicate適切に実装する方法がわかりません。

これが私の試みです:

いくつかの説明:

  • BinTree aはバイナリ ツリー データ型で、各ツリー ノードにはラベルが含まれます。
  • Partial a左または右の部分木を持つ二分木です。私のコードのスタックはPartial a 、データ コンテキストの役割を果たします。
  • BTZBinTreeのインスタンスを作成したいジッパーを表しComonad、データ コンテキストとフォーカス サブツリーで構成されます。

のインスタンスにするためにComonad、私の計画は と を実装extractduplicate、いくつかのランダムなバイナリ ツリーを取得して、コモナド プロパティが保持されるかどうかを検証することです。

これextractは簡単で、フォーカス サブツリーを取り出すだけです。

関数dupは、各ノード ラベルをそのノードに焦点を当てたツリー ジッパーに置き換える補助関数として機能します。

の場合duplicate z、ノード ラベルはzそれ自体である必要がありextract . duplicate == idます。非リーフ ノードのdup場合、親がいないかのようにサブツリーを処理し、現在のフォーカスzと残りのデータ コンテキストが後でこれらのジッパーに追加されます。

これまでのところ、最初の 2 つの comonad プロパティ (extract . duplicate = idおよびfmap extract . duplicate) は満たされていますが、データ コンテキストをどうするかはわかりません。私が現在していることは、ジッパーを取り、z上げ続けることです. 途中で、各データ コンテキスト スタックのトップを取得して新しいデータ コンテキスト スタックを構築します。これは正しいように聞こえますが、正しい型 ([Partial (BTZ a)]です。しかし、私のアプローチでは第 3 法則を満たすことはできません。

上記のバイナリ ツリー ジッパーのデータ型定義を考えると、それを Comonad のインスタンスにすることは可能ですか? 答えが「はい」の場合、私のアプローチに何か問題がありますか?