リストの基本処理2

head.hs

main = do cs <- getContents
          putStr $ firstNLines 10 cs

firstNLines n cs = unlines $ take n $ lines cs

まずfirstNLines関数に10とcsという2個の引数が渡されている事に注目です
一般には、関数適用は次のように書きます。

関数名 引数1 引数2 引数3……

そして、firstNLines関数の定義にも着目です

関数名 仮引数1 仮引数2……  =本体

firstNLinesのNは任意のN行のNなので(ちょっとまどろっこしい?)
firstNLinesを要約すると、最初のN行を表示する関数という事になります。
UNIXのheadコマンドは最初の数行だけを表示します

unlines関数:←→lines関数
つまり、

unlines ["aaa","bbb","ccc"] = "aaa\nbbb\nccc\n" 
unlines ["aaa"]             = "aaa\n"            
unlines [""]               = "\n"
unlines []                 = ""      →空リストを表す
unlines ["aaa\n"]           = "aaa\n\n"            
末尾に改行文字を付加する事がポイント
また、unlines関数はlines関数の返り値であると想定しているので
改行文字を含まないと想定しています。
ですから最後の例のように改行文字が入っている場合は
改行文字が重複します

take関数:リスト先頭からn要素をとってリストで返します
リストが長さnよりも短い場合はリスト全体を返します

take 3 [ 5, 2, 4, 6, 8 ] →  [ 5, 2, 4 ]
take 3 [ 5 ]              →  [ 5 ]
take 3 [ ]                →  [ ]

take 3 "string "          →  "str"
take 3 "s"                →  "s"
take 3 " "                →  " "
take 0   [ 1, 2, 3 ]     →  [ ]
take(-1) [ 1, 2, 3 ]     →  [ ]
take 0 や take(-1) というのは特殊 (イジワル!) で
この数字は正の数でなければ意味がないのです!!
よって空リストで値が返ってきます

そんなこんなで最初のmainアクション解説は
csファイルを入力します。
そしてcsファイルを行ごとのリストに分割して、そのリストのn行目を取り出します。
そして、文字列に連結させた最初の10行を出力します

こんな感じです(^^)v