"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インスタンス二つを並列に合成する演算子を導入する、と。
途中ですが、遅くなってしまったので以下次号。