問題タブ [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:B
def f(a:A, leftNeighbors:List[A]): B
List[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]
対称性に注意してください。List
Monad
Zipper
Comonad
それは理にかなっていますか?
haskell - 「インターリーブ準同型」の概念は本当ですか?
次のクラスの関数が必要です。
明らかに、私が発明した名前は、いかなる意味でも正式な用語ではなく、上記の型クラスはあまりエレガントではありません。これは名前を持つ概念ですか、それともいくつかのライブラリで実装されていますか? これを行うためのより合理的な方法はありますか?
この関数の目的は、f
いくつかのデータに注釈を付けるコンテキストがあることです (この質問のためのランダムなデータ構造の例です) Foo
:Bar
ポリモーフィックな方法でデータのコンテキストを変換したいと思います。コンテキスト間の準同型性のみを知っており、(必然的に) データ自体を気にする必要はありません。これは、上記の例ではinstance InterleavedHomomorphic Foo
andを指定することで実行できます。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)
を定義する方法がわかりません。return
extract
haskell - なぜ IO は共通モナドではなくモナドなのですか?
出力は効果的な計算です。したがって、それをモナドにカプセル化することは理にかなっています。しかし、入力は状況依存の計算です。したがって、それをコモナドにカプセル化する方が理にかなっています。
しかし、Haskell では入力と出力の両方がIO
モナドにカプセル化されています。なんで?
haskell - バイナリ ツリー ジッパーを Comonad のインスタンスにする方法は?
バイナリ ツリー ジッパーを comonad のインスタンスにしたいのですが、duplicate
適切に実装する方法がわかりません。
これが私の試みです:
いくつかの説明:
BinTree a
はバイナリ ツリー データ型で、各ツリー ノードにはラベルが含まれます。Partial a
左または右の部分木を持つ二分木です。私のコードのスタックはPartial a
、データ コンテキストの役割を果たします。BTZ
BinTree
のインスタンスを作成したいジッパーを表し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 のインスタンスにすることは可能ですか? 答えが「はい」の場合、私のアプローチに何か問題がありますか?