1
ジッパーがコモナドである理由の理解
これは私の前の質問に対する回答のフォローアップです。 私は、各項目をマッピングする必要があるとa:AのList[A]のb:B機能をdef f(a:A, leftNeighbors:List[A]): Bして生成しますList[B]。 もちろんmap、リストを呼び出すだけではなく、リストジッパーを使用できます。ジッパーは、リスト内を移動するためのカーソルです。現在の要素(focus)とその隣接要素へのアクセスを提供します。 今、私は自分を置き換えることができfて def 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であるMonadとZipperされますComonad。 理にかなっていますか?