import Control.Arrow newtype SF a b = SF {runSF ::[a]->[b]} instance Arrow SF where arr f = SF (map f) SF f >>> SF g = SF (f >>> g) first (SF f) = SF (unzip >>> first f >>> uncurry zip) -- ではややこしい話の前に、Arrow の利点を強調する例。向こうからやって -- 来た数字の値を二倍したい。やってくるのは数字と分かっているが、数字 -- は一つかも知れないし、リストに入っているかも知れないし、IO 操作に関 -- する物かも知れない。なんと Arrow を使うと、同じ定義が、リストにもス -- カラにも(多分モナドにも)使える!ここ感動する所です! double :: (Arrow a, Num b)