113

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

の各項目を関数でマップし、生成する必要がa:AあるとList[A]します。b:Bdef f(a:A, leftNeighbors:List[A]): BList[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]対称性に注意してください。ListMonadZipperComonad

それは理にかなっていますか?

4

1 に答える 1