これは私の前の質問に対する回答のフォローアップです。
私は、各項目をマッピングする必要があると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
。
理にかなっていますか?