今日もやっぱり、
"Programming with Arrows" http://www.cs.chalmers.se/~rjmh/afp-arrows.pdf
の続き。
1.2 The Arrow class の後半で、前半で定義したArrow classを使った例として、
tream Function(SF)を定義してみる。SFの中身は、[a] ->[b]なので、リストを取ってリストを返す、と。
たとえば、(map (+1) ) とか、(filter (\x -> x == 1))とか、(x:)とか([1,2]++)みたいな関数を
中身にとる、と。載っていた例は、↓こんな感じ。

class Arrow ar where
    arr::(a->b)-> ar a b
    (>>>)::ar a b -> ar b c -> ar a c

newtype SF a b = SF {runSF ::[a]->[b]}

instance Arrow (->) where
    arr = id
    (>>>) = flip (.)

instance Arrow SF where
    arr f = SF (map f)
    SF f >>> SF g = SF (f >>> g)

plusOne = arr (+1)

delay x = SF (x:)

delayZero = delay 0

main = do
    print $ runSF plusOne [1..5] 
    print $ runSF delayZero [1..5] 
    print $ runSF (plusOne >>> delayZero) [1..5]
    print $ runSF (delayZero >>> plusOne ) [1..5]

出力結果は↓こんな感じ。

[2,3,4,5,6]
[0,1,2,3,4,5]
[0,2,3,4,5,6]
[1,2,3,4,5,6]

(filter f)や、([1,2]++)でも試してみようと思う、あとで。

この例までのところでは、まだまだArrowを使う意味、使う価値が全然わからない。
SFでは関数の結合とほとんど同じではないか、という感じだが、
もう少し進んだら、きっとなんか便利なことがあるんであろう。。。