ふつうのHaskelプログラミング

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門青木 峰郎 山下 伸夫

ソフトバンククリエイティブ 2006-06-01
売り上げランキング : 1425


Amazonで詳しく見る
by G-Tools


今私が一番注目しているソフトウェア技術は関数プログラミングです。
Haskell関数プログラミング言語として最近人気の出てきている言語ですが、今までのプログラミング言語とはかなり違うので難しいという印象があるようです。

この本は数学的になりがちなHaskellの解説をわかりやすく書いていてふつうのプログラマーにもわかりやすいというのが売りのようです。
しかし元々のものが難しいのでそんなに簡単とは思えませんでした。
しかたがないとは思いますが。

まずHaskellのコードの見た目がかなり変わっています。
入力からの文字列を表示するcatのようなプログラムのコードはこんな感じになります。


main = do cs <- getContents
putStr cs

mainというのがCでいうmain()関数でdo以下が実装コードになります。
変数csは->という記号で関数getContentsが出力する値に束縛されるという意味になります。
こういう表現がなんか学術的ですよね。
今までの関数の戻り値を変数に入れるという考え方ではないようなのですごく違和感がありますね。
Lisp使いはこの表現の方が自然なようですが。


Haskellの特徴としてはこんなものがあります。

● 関数プログラミング
 今までのプログラミング言語は副作用を許したものでした。
数学的にいうと関数とは入力を入れると出力を出すものでその中でデータを書き換えません。
Haskell関数プログラミングの理論に忠実に関数でデータを変更しません。

● リスト構造データ
 Haskellのデータはリスト構造になっています。
Lispに慣れている人はすぐに使えるようになるでしょうね。

● 遅延評価
 遅延評価とはコードの評価(実行?)をできるだけ遅らせるという機能です。
例えば巨大なデータをスキャンして最初のデータを取り出すプログラムを考えてみましょう。
Javaなどの言語では最初の関数でデータを全て読み込んで最初のデータを切り出すという作業が必要です。
しかし遅延評価を使うと切り出すデータ量がわかった時点で読み込むことができます。
この方法の難点はデバッグがしずらいというところですね。
そこはユニットテストなどのテクニックでカバーするしかないでしょうね。

● 高階関数
 高階関数とは関数を値のように扱える機能です。Lisperには当たり前のテクニックですね。
高階関数の例としてMapという関数があります。


map square [1,2,3]

このコードは[1,2,3]というリストデータのそれぞれの要素を自乗します。
なので出力は[1,4.9]ですね。
つまりMap関数は指定された関数をパラメーターの要素のそれぞれに適用する関数です。
このsquareを別の関数に入れ替えることによって関数を変数のように使うことができます。

map f [1,2.3]

Cでいう関数へのポインタに近い考え方ですね。
しかしHaskellは言語自体でサポートしているのがうれしいところです。


そしてHaskellの最大のわかりにくいのはMonadという機能です。
どうやら関数を数珠つなぎにできる技術らしいのですが、元々は数学の考え方のようでいまいち理解できませんでした。
もうちょっと深く勉強する必要がありそうです。


こんな感じでいままでのプログラミング言語とはかなり雰囲気の違う言語です。
この本はそのあたりをかなりわかりやすく解説しています。
しかしHaskellの本当のよさがいまいち解説しきれていない感じもします。
かなり使い込まないとよさはわからないのかもしれません。
でも入門書としてはおすすめですね。
余談ですがもう一冊日本語のHaskellの本がありましたが、そちらはかなりわかりにくかったです。


Haskellコンパイラとインタープリターがあるので用途によって使い分けられるのもいいですね。
スクリプト言語は手軽ですが、パフォーマンスを重視する場合はやっぱりCで書かなければいけないという現状はそろそろ変えた方がいいと思います。
この言語がそのきっかけになるといいですね。