Haskell のお勉強 その7

 tailコマンドの作成。
 
 まず、始めにテストデータの作成。

test_hoge

hoge0
hoge1
hoge2
hoge3

 次に、プログラムの作成。
 最後の2行を表示するtailコマンド。

main = do cs<-getContents
          putStr $ lastNLines 2 cs

lastNLines n cs = unlines $ takeLast n $ lines cs
takeLast   n ss = reverse $ take n $ reverse ss

 今回、初めて出てきたのは、「reverse」関数のみ。
 「reverse」関数は、引数として渡されたリストを逆順にしてリストを返すというもの
 ghciでの実行結果。

Prelude> reverse [1,2,3,4,5]
[5,4,3,2,1]

 作成したtailコマンドは、
 まず、標準入力から入力された文字列をlastNLines関数に渡し関数適用します。

 lastNLines関数の中で引数として渡された文字列は、lastNLines関数によって、
 各行を要素とするリストに変換され、さらにtakeLastに、渡されます。
 
 takeLast関数は、引数として渡されたリストを、reverse関数を適用することにより
 逆順のリストとして、take関数を適用することで、リストからn個の要素を取得して、
 その結果を再度、reverse関数でリストを元の戻し、結果をlastNLines関数に戻す。
 
 lastNLines関数は、最後にunlines関数でtakeLast関数から返されたリストを
 文字列に変換しmain関数に戻す。
 
 main関数は、最後に文字列をputStrで標準出力に出力する