do記法でArrowを使いこなす基本メモ

3分で解るHaskellのArrowの基本メモ - よくわかりませんで残ったdo記法。Arrow syntax7.17. アロー記法を読んで理解したつもりのメモ。


感覚的には、Monadのdo記法と同じ。違いは、

  • Arrowを作る予約語「proc」を先頭で使う。感覚的には「(proc x->○△□)」は、「arr (\x->○△□)」と同じ。
  • 「-<」を使ってArrowへの入力を書く。「a -< x」で、aへxを入力*1
  • Arrowのdo記法は、doブロック全体でまたArrowになる。最後は、Arrowへ何か入力させる形が普通。(何もしない素通しのArrow「returnA」*2がよく使われる)


入力を、Arrow「f」と「g」に食わせたそれぞれの結果を + するArrow 「addA」(イメージ図を見ると解りやすい)

addA f g = f &&& g >>> arr (\ (y, z) -> y + z)

*3

    addA :: Arrow a => a b Int -> a b Int -> a b Int
    addA f g = proc x -> do
                    y <- f -< x
                    z <- g -< x
                    returnA -< y + z

こう書ける。


バラして見てみると、

    addA f g = proc x -> do

「addA f g」は、xを入力として、do以下のコマンドを実行するArrow。

                    y <- f -< x
                    z <- g -< x

Arrow「f」にxを入力した出力をy、Arrow「g」にxを入力した出力をz、として、

                    returnA -< y + z

「y + z」を、何もしない素通しのArrow「returnA」に入力。(というArrowが出来た。returnAの出力をどうするかは、このArrowを使う人次第)



Monadのdo記法と同様、let節(inが無い奴)も使える。


さらに、Arrowの種類(サブクラス)によっては、if節やcase節による分岐、rec節による再帰もできるらしいが、また今度。


(追記)Arrowのdo記法は、Haskell98に対する拡張記法なので、GHCで-farrowsオプションが必要(GHCiのREPL中なら「:set -farrows」)。

*1:「-<」でArrowに入力を指定したもの(例:「a -< x」)を コマンド という

*2:定義は「returnA = arr id」

*3: (&&&)は、(***)の前に「\x->(x,x)」を噛ませたもの