Arrow の do 記法

id:syd_syd さんに教えていただいた arrow の do 記法。do 記法内でバインドした値は(おそらく) arrow の中に入れることしかできない。つまり arrow として使えない。僕はよくわかっていないんですが。

{-# OPTIONS -farrows #-}
import Control.Arrow

listcase [] = Left ()
listcase (x:xs) = Right (x,xs)

mapA f = proc xs -> do
    t <- listcase -< xs
    case t of
      Left () -> returnA -< []
      Right (x,xs) -> do y <- f -< x
                         ys <- mapA f -< xs
                         returnA -< y:ys

それと、id:suer さんによって、

t <- listcase -< xs

が、"listcase" というラベル付きの arrow に xs を入れているというふうに見るべきだ、との素晴らしい指摘を受けました。