リストの基本処理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