人気ブログランキング | 話題のタグを見る

RWH の読み方(27) 第4章

Real World Haskell 第4章 Functional Programming

A Line-Ending Conversion Program

このサブセクションでは A Simple Command-Line Framework の InteractWith.hs と Warming Up: Portably Splitting Lines of Text の SplitLines.hs を組み合わせて改行文字の自動変換を行うプログラム FixLines.hs を作成している。FixLines.hs の全ソースファイルは表示してないので、このブログで紹介した filter.hs と SplitLines.hs を統合した fixlines.hs を次に示す。

main = do
  xs <- getContents
  putStr $ fixLines xs

fixLines :: String -> String
fixLines input = unlines (splitLines input)

splitLines :: String -> [String]
splitLines [] = []
splitLines cs =
  let (pre, suf) = break isLineTerminator cs
  in pre : case suf of
    ('\r':'\n':rest) -> splitLines rest
    ('\r': rest) -> splitLines rest
    ('\n': rest) -> splitLines rest
    _ -> []

isLineTerminator c = c == '\r' || c == '\n'

これを ghc --make fixlines.hs でコンパイルすると実行可能ファイル fixlines.exe ができる。

フリーのエディターの TeraPad でテキストファイル test.txt を作成し、

ファイル名: test.txt
line 1
line 2

Terapad の[ファイル]-[文字/改行コード指定保存] メニューで改行コードを LF に指定して保存する。test.txt をバイナリエディタの Bz で開くと改行コードが 0A になっているのが分かる。(検索窓に #0a と入力して検索するとよい。)

次に fixlines < test.txt > test2.txt で改行コード変換を行い、Bz で test2.txt を開くと、改行コードが 0D 0A に変換されているのがわかる。

RHW本文のプログラムの SplitLines も自分で作成してみると、Haskell のプログラムの再利用がほとんどコピー・ペーストでできるのに驚くだろう。関数型言語は、基本的にグローバル変数のような環境依存のパラメータがないので、プログラムの再利用が簡単にできるからだ。
by tnomura9 | 2012-04-06 05:13 | Haskell | Comments(0)
<< RWH の読み方(28) 第4章 RWH の読み方(26) 第4章 >>