早川です。

ghci で実行してみたら以下のような結果になりました。
これは reverse を使っても全リストを溜め込まないという
ことでしょうか??

$ cat tail.hs
tailn1 n    = reverse.(take n).reverse
tailn2 n ls = difftail ls (drop n ls)
    where difftail hs []         = hs
          difftail (_:hs) (_:ts) = difftail hs ts

tailn3 0 _  = []
tailn3 n ls = (tailn3 (n-1) (init ls))++[last ls]

tailn4 n xs | length xs <= n = xs
            | otherwise      = tailn4 n (tail xs)

$ ghci tail.hs
*Main> :set +s
*Main> tailn1 10 [0..9999]
(0.07 secs, 0 bytes)
*Main> tailn2 10 [0..9999]
(0.16 secs, 3880176 bytes)
*Main> tailn2 10 [0..9999]
(0.13 secs, 0 bytes)
*Main> tailn3 10 [0..9999]
(0.22 secs, 3793324 bytes)
*Main> tailn3 10 [0..9999]
(0.23 secs, 3994760 bytes)
*Main> tailn4 10 [0..9999]
(22.17 secs, 3301880 bytes)

(結果の出力は消しておきました)

tailn2 の書き方だとキャッシュされるんですね。

--
SH
tetryl / tokyoprogrammer.com


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/