1. ホーム
  2. scala

[解決済み] ジッパーがコモナドである理由を理解する

2022-10-09 07:03:33

質問

のフォローアップです。 回答 の続きです。

各項目をマッピングする必要があるとします 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] というわけで ListMonad であり ZipperComonad .

意味はあるのでしょうか?

どのように解決するのですか?

この質問は未解答リストのトップに定期的に表示されるため、私のコメントを回答としてここにコピーさせてください - とにかく 1 年前よりかなり建設的なものは何も現れていません。

A List はコモナドと同じように(複数の方法で)見ることができますが、一方 Zipper はモナドとしてキャストすることができます(これもいろいろな方法で)。その違いは、概念的にステート マシンに建設的にデータを追加することに重点を置いているかどうかです(これは Monad インターフェイスがそうです)、または、そこから "分解的に状態を抽出すること(これこそ、 が行うものです)。

しかし、「この理解は意味があるのか」という問いに答えるのは簡単ではありません。ある意味ではそうですが、別の意味ではそうではありません。