Haskell

$Id: index.html,v 1.6 2003/10/16 06:12:29 aamine Exp $

関数型プログラミング言語 Haskell に関する情報です。 初心者ではありますが、あまりに Haskell の情報が少ないので書いときます。

いままでずっと手続き型のプログラミング言語 (C とか Java とか Ruby とか) で生活してきた人間が突然 Haskell を使うとどう思うのか、 という観点を第一に書いています。学問的な正確さには興味がありません。

いまさら人に聞けない Haskell の疑問

Q. 「Haskell」ってどう読むの
A. 「はすける」みたいです。 ちなみに論理学者の Haskell B. Curry に由来するそうです。 「カリー化」の Curry もこの人の名前から来てます。
Q. Haskell は関数型言語なの?
A. そうです。
Q. 関数型言語って何さ。
A. 厳密さを考えずに言うと、 関数がプログラミングの中心にあるような言語のことです。 定義は人によってズレがありますが、 少なくとも C や Java は関数型ではなく、Haskell は確実に関数型であり、 ML も関数型であるということに異を唱える人はほとんどいません。 Lisp を関数型に入れるかどうかは人によって違うようです。
Q. Haskell は純粋な関数型言語らしいけど、普通の関数型言語とはどこが違うの?
A. 副作用のあるコードをいきなり書けないところです。 書けないわけではありません。 ここを深くつっこむとわけがわからなくなるうえに宗教戦争が勃発するので、 あまりつっこまないでください。
Q. 誰が作ってんの?
A. 委員会があるみたいです。
Q. Haskell と ML ではどっちがいいの?
A. 「よい」の定義によります。が、一般的な違いを言うならば、 副作用のあるコードは ML のほうが気軽に書けること、 Haskell は非正格 (non-strict) である、という二点が挙げられます。
Q. 「非正格」って?
A. プログラムがどこから評価されるか決まってない、という性質です。
Q. それでプログラムが書けるの?
A. 書けるんです。そこが面白いとこです。
Q. ML プログラマとは仲が悪いんですか。
A. その傾向はないと言えないこともありません。
Q. Lisp プログラマとは仲が悪いんですか。
A. Common Lisp プログラマと Scheme プログラマの関係と同じくらいです。
Q. ぶっちゃけ Haskell プログラマって日本にどのくらいいるんだろう。
A. ……1000 人以下かなあ? (2003 年現在)
Q. 処理系はどれがいいの?
A. コンパイラなら GHC、インタプリタなら GHC についてる ghci か Hugs。 どちらもそれなりには安定してます。
Q. 言語の最新バージョンはどれよ。
A. Haskell98 というのが最新です。
Q. ライブラリはどのくらいあるの。
A. あんまりありません。 以下の「リンク集」のところにライブラリ集へのリンクがありますので見てください。
Q. 標準ライブラリが固まってないように見える。
A. どうやら今は移行過程にあるようです。 hierarchical library という階層化されたやつが新しいもののようですね。
Q. Perl の CPAN みたいのはないのかな?
A. なさげです。
Q. んで結局普通のプログラムは書けるのかね?
A. UNIX コマンドの例を下のほうに置いときます。 またコンパイラの GHC は Haskell 自身で書いてあります。
Q. モナドって何?
A. 型の積、というか、組み合わせみたいなもの……でしょうか。 「モナドはどう使うのか、どう動くのか」と考えるほうが幸せになれます。
Q. じゃあ、モナドは何に使うの?
A. よく見かけるのは IO モナドです。 これは I/O をするときなど、副作用が発生する場合に使います。
Q. 副作用、あるんじゃん!
A. だからつっこんじゃだめなんだってば。
Q. どう使うの?
A. 下のほうにコード例があるので見てください。 「IO」と書いてあるところが IO モナドを使っています。
Q. ちょっとプログラム書いてみたけど、IO モナドってウザいね。
A. まったくです。
Q. 「Haskell は参照透明性が保たれているから凄いのだ」 と聞いたのですが、参照透明性ってなんですか。
A. おもいきり簡単に言うと、副作用が起きないという性質です。
Q. それっていいの?
A. いいという人もいますし、そのほうがいいプログラムもあるのです。
Q. でもデカいデータの一部分だけを変更したいことってあると思うけど、 そういうときは全部作り直すの?
A. そうです。 そういうプログラムには Haskell は向いていないかもしれません。 しかしそういうプログラムばかりではありませんし、 ハードウェアが速くなれば問題にならないかもしれません。
Q. メーリングリストとか、ある?
A. 日本語のメーリングリストがあります。 sampou.orgの案内を見てください。
Q. Haskell プログラムって速いの?
A. 動かすプログラムと、「速い」の基準によります。 しかし一般的には、カリカリにチューンした C よりは遅く、 Perl や Ruby などのインタプリタよりは速い、という感じです。 ただしこれは GHC でコンパイルした場合で、Hugs はめっちゃ遅いです。
Q. 今の流行りはオブジェクト指向なんだよ、 Haskell はオブジェクト指向じゃないからヤダ、 とにかくオブジェクト指向にしてください!
A. O'Haskell というオブジェクト指向拡張があるみたいです。
Q. 日本語の情報が少なすぎるぞゴルァ!
A. 激しく同意! ぜひ自分でもサイトを作ってください。
Q. ところで、なんで Haskell なんか使ってんの。
A. 関数型ってなんとなくかっこよさそうだから。
Q. loveruby.net というドメインで Haskell のページを置くのはいかがなものか。
A. プログラミング言語は一夫一婦制を採用していないので、 法的にも道義的にも問題はありません。

Haskell プログラムの実例

あんまり見付からなかったのでとりあえず自分で書いてみました。 いくら解説を読んでもコード例を見ないと理解できない筆者のような人はどうぞ。

書籍

Haskell に関する本はあまりありません。 わたしは以下の二冊を持ってます。

この二冊のうちどちらか一冊ならば、 前者の Craft of ... が圧倒的によいです。 後者はあくまで「Introduction to Functional Programming」 であって、Haskell の本ではありません。

日本語だと「関数型言語」とかなんとかいう題名で一冊 Haskell を使ってるのがあるようです。

リンク集