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