ジッパーがコモナドである理由の理解


112

これは私の前の質問に対する回答のフォローアップです。

私は、各項目をマッピングする必要があるとa:AList[A]b:B機能をdef f(a:A, leftNeighbors:List[A]): Bして生成しますList[B]

もちろんmap、リストを呼び出すだけではなく、リストジッパーを使用できます。ジッパーは、リスト内を移動するためのカーソルです。現在の要素(focus)とその隣接要素へのアクセスを提供します。

今、私は自分を置き換えることができfdef f'(z:Zipper[A]):B = f(z.focus, z.left)、この新しい関数を渡すf'cobindする方法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であるMonadZipperされますComonad

理にかなっていますか?


1
私は専門家ではありませんが、それは私には理にかなっています。あなたの説明を読んでいる間、私はひらめきを持っていました。ありがとう!
acjay

7
あなたの質問はSO形式で答えることは非常に困難です...しかし、あなたは完全に正しいです。要素重視のジッパーは常にコモナードです。
J.アブラハムソン2014

4
リストも同様に(複数の方法で)コマンドとして表示でき、ジッパーはモナドとしてキャストできます(さまざまな方法で)。違いは、概念的に、データを建設的にステートマシンに「追加」すること(モナドインターフェースの概要)に焦点を合わせるのか、それとも「破壊的に」データを「抽出する」(コモナドが行う作業)のどちらに重点を置くかです。「この理解は理にかなっている」と述べられている質問に答えることは容易ではありません。ある意味ではそうしますが、別の意味ではしません。
KT。

2
何かをコマンドにキャストするには、2つの操作を提供する必要があります。1)値の抽出(たとえば、リストの先頭である場合があります)および2)リスト処理操作の適用(たとえば、スライドで適用できます)リストに沿ったウィンドウ方式、または適切な単位変換でリストが変更されないと想定した場合の要素ごとの方式など)。このようなリストの処理方法が意味を成すかどうかは、別の問題です。裸のコモナードインターフェースは、リストを作成する方法も、リストを走査する方法も提供しないことに注意してください。リスト対応の操作を利用する方法だけがわかっています。
KT。

2
@eenblamその通りです。私は答えを追加し、それが未解決のリストから外れ、この質問を取得します、私は願っています
マイケル・

回答:


1

この質問は「未回答」リストの一番上に定期的に表示されるため、ここに回答としてコメントをコピーします。とにかく、1年前からそれほど建設的なことはありません。

A Listは(複数の方法で)コモナードとしても表示Zipperできますが、(多くの方法で)モナドとしてキャストできます。違いは、概念的に、データを建設的にステートマシンに「追加」すること(つまり、Monadインターフェースについて)に焦点を合わせるのか、それとも「データを破壊する」ことから「抽出」するのか(つまり、Comonad

「この理解は理にかなっている」と述べられている質問に答えることは容易ではありません。ある意味ではそうしますが、別の意味ではしません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.