do記法でArrowを使いこなす基本メモ
3分で解るHaskellのArrowの基本メモ - よくわかりませんで残ったdo記法。Arrow syntaxと7.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」)。