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