Sコンビネータ
http://alohakun.blog7.fc2.com/blog-entry-451.htmlより。
僕も勉強のために自分で手を動かして読み解いてみました。Sコンビネータを使うと、変数が1回しか出てこなくなってます。そうか、こうやって使うのか…
slide :: [a] -> [a] -> [a] slide xs [] = xs slide (_:xs) (_:ys) = slide xs ys starling :: (a -> a -> a) -> (a -> a) -> a -> a starling f g x = f x (g x) tailn :: Int -> [String] -> [String] tailn n ls = starling slide (drop n) ls -- lsは1回だけ。 tailn2 :: Int -> [String] -> [String] tailn2 n ls = slide ls $ drop n ls -- lsが2回でてくる。 main :: IO () main = putStr . unlines . tailn2 10 . lines =<< getContents
それはそれとして、関数starlingの型ってこれでいいのかな。うーむ。
参照: SKI combinator calculus - Wikipedia