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

RWH の読み方(24) 第4章

Real World Haskell 第4章 Functional Programming

Thinking in Haskell

以下に述べるのはこのセクションを読んだ管理人の感想で、本文の翻訳ではない。いちいち引用するのは面倒なので、本文から離れた記述もしているので注意して欲しい。

このセクションでは初心者が Haskell を学習する際に感じる2つの壁について述べてある。

一つ目の壁は、プログラムに対する考え方の転換だ。手続き型のプログラム言語を使っていた時のプログラミングの考え方は、関数言語では使えない。関数言語でプログラムを作るときは、プログラムというものは何かということについて、手続き言語の時とは全く異なる考え方をしなければならないからだ。

例えば、Haskell にはデータの値を保持している記憶領域という意味での変数はない。変数は全て他の関数や合成関数の別名である。したがって、変数への値の代入というものはない。val = 3 というような表記でさえそれは、3を返す val という関数を定義しているにすぎない。

また、関数の定義には手続き型言語のような複数文( multi-statement )というものもない。それは常に関数の合成からなる単文( single-statement )でしかない。

したがって、Haskell の世界でのプログラムのイメージは、手続き型言語のプログラムのイメージとは全く異なる発想で捉えなければならない。このプログラムというものに対する根本的な物の見方の転換が第1の関門になる。

それでは、どうしたらこの根本的な発想の転換ができるのだろうか。それは一旦自分のプログラミングの経験を忘れて、全くの初心者の気持ちで簡単なプログラムを作って見ることだ。かえって手続き型言語の知識を持ち込まないほうがいい。Haskell は使ってみるとそう難しくはない。

第2の壁は、Haskell の標準ライブラリを使うときに出くわす。Haskell に限らずライブラリを使いこなせなければまともなプログラムは書けない。しかし、Haskell のライブラリは抽象性が高く、一方ではそれは多くの応用例に適応できる汎用性をもたらすが、他方ではそのライブラリの使いこなし方を理解するのを難しくしている。この抽象的なライブラリの扱いに慣れるのが第2の関門だ。

例えば map という高階関数がある。引き数に関数とリストをとり、リストの個々の要素にその関数を適用し、新しいリストを作る。引き数に関数をとるという抽象性が手続き型言語の考え方 ( mind-set ) から見ると異質だが、それは、次のように同じ関数が様々な異なる処理に使えるという汎用性をもたらしている。

Prelude> map (*2) [1,2,3,4]
[2,4,6,8]
Prelude> map (^2) [1,2,3,4]
[1,4,9,16]

この章では関数型言語へのパラダイムシフトと抽象的ライブラリの活用という2点について実習しながら学べるようになっている。この章をマスターすれば、Haskell (関数型言語)の基本的なプログラミングテクニックを身につけることができる。
by tnomura9 | 2012-04-02 19:47 | Haskell | Comments(0)
<< RWH の読み方(25) 第4章 ねこみみ少女 >>