ふつける:8章読んだ

8章は「関数」.関数結合とか部分適用とか.7,8章と一気に書くと長くなるんで,分けました.それでは練習問題を解きます.

文字列の先頭にある空白類文字を全て削除する関数lstripをポイントフリースタイルで

空白類文字ね.CharをimportしてisSpaceで良いか.

import Char

lstrip :: String -> String
lstrip = dropWhile isSpace

文字列の末尾にある空白類文字を全て削除する関数rstripをポイントフリーs(ry

lstripを使っても良い.reverseしてlstripしてreverseが楽そう.

rstrip :: String -> String
rstrip = reverse.lstrip.reverse

lstripの続きに書いてます.

文字列の先頭と末尾にある空白類文字を全て削除する関数stripをポイントf(ry

lstripとrstripは使っちゃ駄目,という制限付.メンドクセ.

strip :: String -> String
strip = reverse.dropWhile isSpace.reverse.dropWhile isSpace

ただ並べただけ.ちなみに,lstrip,rstripを使ったら,

strip' = rstrip.lstrip

とっても短い.これじゃ練習にならんな.


それじゃ,動作を確認してみます.

Main> lstrip "   \t  \n  hoge"
"hoge"
Main> rstrip "hoge    \t  \n "
"hoge"
Main> strip "  \t \n hoge  \n"
"hoge"

よし.

2章で作成したtail.hsを,できるだけポイn(ry

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

lastNLines :: Int -> String -> String
lastNLines n = unlines . takeLast n . lines

takeLast :: Int -> [String] -> [String]
takeLast n = reverse . take n . reverse

nは消せるのかしら.解答を見てみたんだけど,こりゃどうもhead.hsのコードだな.誤植か.
実行結果です.

$ ./tail < tail.hs

takeLast :: Int -> [String] -> [String]
takeLast n = reverse . take n . reverse


ラストのfgrepは,普通に書いてあるのでやりません.