改行文字変換プログラム

Haskell で数値計算だけをやっていても面白くないので、普通のプログラムはないか探してみた。オライリー社の、Real World Huskell, by Bryan O'Sullivan, John Goerzen, and Don Stewert という本にはそういう例がふんだんに出てくる(らしい。まだ読み始めたばかり)。そのなかで、Unix, Windows, Mac で異なる改行文字を認識して、文字列から行を取り出すプログラムがあったので引用する。

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'

実行例:
Hugs> :e splitlines.hs
Hugs> :l splitlines.hs
Main> splitLines "foo\r\nbar"
["foo","bar"]

これを見ると Haskell の表現力が数値計算に止まらないことが分かる。上のプログラムで break predicate list 関数は、引数のリスト list の中で、predicate が True になる文字があれば、その前の部分と、その文字を含む後の部分に分ける働きがある。break は Prelude の標準関数だ。

手続き型のプログラムの if 文は引数のパターンで、繰り返しは再帰関数で表現されている。パターンと再帰関数は最初は戸惑うが、慣れると可読性の良いすっきりしたプログラムを書くことができる。

Haskell は普通の汎用言語なのだ。
[PR]
by tnomura9 | 2009-09-23 05:25 | Haskell | Comments(0)
<< Hugs でディレクトリ操作 畳み込み(convolution) >>