テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

Arrow

Control.Arrowは, 計算というものを単位として, それを組み合わせることによってプログラムを表現出来ますね, を提供する.

と, 思う.

ここ数日間, Arrowについて調べてきたが, 結局よくわからなかった. 作業を一旦クローズしたいので, 理解したことを書きまとめる. 間違っていることや, このライブラリ試してみるといいよとか, この文章(or ビデオ)オススメだよとかあれば頼む.

  • ArrowはCategoryでもある.
  • Categoryはidと合成(.)を提供する.

Arrowは以下の3つを実装する必要がある.

  1. arr :: (b->c) -> a b c : これは関数をArrowにする.
  2. (>>>) :: a b c -> a c d -> a b d : これは関数合成のようなもの. Arrowを連結する. 連結というのは, 電気回路のようなものだと思っていい.
  3. first :: a b c -> a (b,d) (c,d) : これは, dを保ったままペアのfirstを変換するArrowを作る. これにより, 大きなArrowの中を状態が伝搬していくことなどを許す.

確かにこの3つがあれば, あらゆる計算もArrowを繋ぐことで出来るような気がする.

  • ペアは, andに相当する. orに相当するのは, Eitherであり, ArrowChoiceは, ペアをEitherにしたものである. これにより選択を許す.
  • ArrowApplyはapp :: y (y a b, a) bを実装することを要求する. これは, y a bとaのペアを入力として, bを出力とするArrowのパーツである. 通常, Arrowは, Arrowの世界で完全に合成し切ったあとに, 入力を与えて適用することで一気通貫的に実行されるが, ArrowApplyがあると, 途中で適用して値に還元することが可能となる.
  • ArrowLoopは, フィードバック回路を表現する. 随伴だとかtraceだとかいう言葉が出てきてパニックに陥った. 関数野郎とは戦争するしかない.

Arrowとその愉快な仲間たちの説明をした. 続いて, Arrowはいつ使うのか?(いや, 今は無理...)を説明する.

  • Arrowは, 値の世界ではなく, より抽象的な関数の世界ですべてを表現しようという試みであり, 実際に, Applicative(static Arrow)やMonad(Kleisli)を表現し得る. 従って, これらを使って実装可能なプログラムをArrowによって実現することが可能である.
  • しかし現実的には, どちらの方が理解しやすいかによって使い分けるのが良い. 値に注目する方がいいこともあるし, 関数の連結に注目することが良い場合もある.
  • Monadのdoに相当するものがArrowのproc(Arrow表記)である. これを使うと, Arrowの連結において出力に対して名前をつけることが出来る. (ただし, do表記のように遥か昔の値を使うことは許されない) 従って, firstやsecondなどを使うより可読性がよくなることもある. (Arrowはポイントフリーを強制する. ポイントフリーは可読性を破滅させることがある. この問題への対策)
  • Arrowが得意な分野としては, pipeやFRPがあり, Haskellライブラリとしてもこのような分野では積極的に使われているようである. 私はFRPについてはよくわかっていないが, ネットワークを使ったイベントの伝搬が根底にあるため, ネットワーク(つまり回路)とArrowは相性が良いという理由で注目されているのだと理解した. (http://qiita.com/as_capabl/items/cefef00635031a540dd3)

全体的な感想としては, よくわからなかったのだが, FRPはReactなどでも大変注目されているし, Arrowも使いこなせるようにならないといけないのだろう, とは思う...

Arrowに関して参考にした文章: