id:mzp さんに触発されて、Arrow 勉強中。 Haskell/Understanding arrows - Wikibooks, open books for an open worldの図が分かりやすいです。 まずは簡単なサンプルで動作を確認。 -- オリジナル f1 as = tail as ++ init as -- 引数を2つの経路に分けて、それぞれ tail と init を適用してから (++) でまとめる。 -- (&&&) の戻り値はタプルなので uncurry が必要。 f2 = arr (uncurry (++)) <<< tail &&& init -- 関数はそれ自体で Arrow のインスタンスなので、arr は不要。(!!) f3 = uncurry (++) <<< tail &&& init -- \ (f, a) -> f a は app で実現で