■
今日もやっぱり、
"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では関数の結合とほとんど同じではないか、という感じだが、
もう少し進んだら、きっとなんか便利なことがあるんであろう。。。