■
"Programming with Arrows"の、2.1 Arrows and pairsを読む。
最初にあらすじを。
2.1では、Arrowクラスのメソッドとして、
まず(&&&)を導入して、その後、よりプリミティブな演算子
(***)を導入する。((***)を使えば、(&&&)は簡単に作ることができる。)
そして、さらにもっとプリミティブなメソッドfirstを導入する。
最後は、firstを使ってsecondを定義、firstとsecondを使って(***)を定義、
(***)を使って(&&&)が定義できるようになる、と。
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Arrow.htmlでは、
実際に、second 、(***)、(&&&)には、first を使ったデフォルトの定義がある。
では2.1の最初から。
モナドでは、
addM a b = do x <- a y <- b return (x+y) main = do print $ addM [1] [1] print $ addM [10,10] [1] print $ addM [10,20] [1, 3]
出力結果:
[2] [11,11] [11,13,21,23]
のように、二つのモナドを、並列にとって足し算する
ことができる。
けれど、今まで見た範囲では、Arrowのインスタンスは、
直列に合成するはできるが、
並列に合成することはできない。
そこで、
class Arrow ar where ... (&&&)::ar a b -> ar a c -> ar a (b,c)
と、新たにArrowインスタンス二つを並列に合成する演算子を導入する、と。
途中ですが、遅くなってしまったので以下次号。