Haskellはコワくない!
おそらくこのWebサイトを訪問してくださった皆さんの多くは、Java、C、Python などなど、とにかくHaskell以外の言語を使ったプログラミングの経験がある方だと思います。 (プログラミング初心者でHaskellに挑戦しようという勇者も大歓迎ですが...)
Haskellを学ぼう!と思い立った皆さんの中にはもちろん「必要に迫られて」という方もいらっしゃるとは思いますが、おそらく多くの方が「難しそうだけど、ちょっとほかの言語とは一味違う感じでおもしろそうだ...」という好奇心から興味を持ったのではないかと思います。
Haskellには、とにかく「難しい」「数学の知識が必要」「概念的」というようなとっつきにくい印象がつきまといます。 もちろんそれらの印象は決して間違いとはいえませんが、しかし私たちの向学心を打ち負かすほどのものではありません。
「難しい」といっても、新しいことを学ぶのだからそう簡単では困ります。
しかし少しの根気さえあればへこたれるほどの難しさではありません。
「数学の知識が必要」といっても、必要なのは豊富な「知識」ではなくちょっとした数学的な「考え方」です。
中学生のときに、数学の授業にまあまあついていけていたなら、内容はまるっきり忘れていても問題ありません。
「概念的」というのも間違いではなく、実際に言語設計の裏には「圏論」などの高度な概念が隠れています。しかしそれらを理解しなければHaskellを使えないわけではありません。私もよくわかっていません。
Haskellは「関数型言語」だ!
さて見出しのとおり、Haskellは「関数型言語」なのですが、そもそもプログラミング言語は、その性質によっていくつかの種類に分けられます。 ここでおさらいしておきましょう。
-
手続き型言語
代表的な言語は、C、Python、FORTRAN、Visual Basic など。
「手続き」を順番に記述していくことでプログラムを作っていきます。 プログラムのサイズが大きくなってきたら、それらの手続きを「関数」として分離し、 さらにそれらの関数を「モジュール」として分離していきます。
(ここでの「関数」は、Haskellの「関数」とはかなり違っているので注意!)
設計は一番簡単なので、比較的小規模なプログラムによく使われます。
-
オブジェクト指向言語
代表的な言語は、Java、C++、C#、Ruby、JavaScript など。
いくつかの「オブジェクト」を設計し、それらがもっているメソッドを利用することで プログラムを作っていきます。 各オブジェクトは内部に「状態」としての変数を格納しており、 ひとつの「もの」のようにふるまいます。
ゲームやWebサイトなどのGUIを設計するような場合には、 特に高い親和性があります。
-
関数型言語
代表的な言語は、Haskell、Scala、LISP、Erlang など。
「関数」を設計し、それらを組み合わせていくことでプログラムを作っていきます。 これらの関数は「状態」をもたないので、同じ引数を与えれば同じ値が返ってきます。 (これを「参照透過性」といいますが、この話はまた今度...)
そのため、これらは数学で使う「関数」と非常に近いものになり、 実際に数学の研究などの場面で使われることが多いです。
さてこれらの分類は、プログラミングにおける考え方の枠組みとして 「パラダイム」と呼ばれます。 また実際には、これらの性質を併せ持った「マルチパラダイム」の言語も 数多くあります。
私たちがこれから学んでいくHaskellは、関数型言語の中でも特に 「純粋関数型言語」と呼ばれるものです。 例えば関数型言語のひとつであるScalaは、オブジェクト指向や手続き型の性質も あわせもったマルチパラダイム言語でかなり使いやすいのですが、 Haskellにはそういう要素が(ほぼ)まったくありません...!
そう!Haskellで書いたプログラムは、関数の組合せだけで記述されているのです! Haskellの簡潔で美しいコードは、その厳密なルールに裏打ちされているのです。
プログラミングを仕事や趣味にしている方は、自分の書いたコードの洗練された美しさに 惚れ惚れしてしまったという経験が何度かあるでしょう。 その感性のあるプログラマであれば、 Haskellのもつ美しい厳密性にハマってしまうこと請け合いです。
さて次回は、Haskellに代表されるような関数型言語がもっている、 ちょっと変な特徴を紹介していきます。それではお楽しみに!