HaskellFaq

いままでずっと手続き型のプログラミング言語 (C とか Java とか Ruby とか) で生活してきた人間が突然 Haskell を使うとどう思うのか、 という観点を第一に書いています。

「Haskell」ってどう読むの

「はすける」みたいです。 ちなみに論理学者の Haskell B. Curry に由来するそうです。 「カリー化」の Curry もこの人の名前から来てます。

Haskell は関数型言語なの?

そうです。

関数型言語って何さ。

関数がプログラミングの中心にあるような言語のことです。 定義は人によってズレがありますが、 少なくとも C や Java は関数型ではなく、Haskell は確実に関数型であり、 ML も関数型であるということに異を唱える人はほとんどいません。 Lisp を関数型に入れるかどうかは人によって違うようです。

Haskell は純粋な関数型言語らしいけど、普通の関数型言語とはどこが違うの?

副作用のあるコードをいきなり書けないところです。 書けないわけではありません。 ここを深くつっこむとわけがわからなくなるうえに宗教戦争が勃発するので、 あまりつっこまないでください。

誰が作ってんの?

委員会があるみたいです。

Haskell と ML ではどっちがいいの?

「よい」の定義によります。が、一般的な違いを言うならば、 副作用のあるコードは ML のほうが気軽に書けること、 Haskell は非正格 (non-strict) である、という二点が挙げられます。

「非正格」って?

プログラムがどこから評価されるか決まってない、という性質です。

それでプログラムが書けるの?

書けるんです。そこが面白いとこです。

ML プログラマとは仲が悪いんですか。

Common Lisp プログラマと Scheme プログラマの関係と同じくらい?

ぶっちゃけ Haskell プログラマって日本にどのくらいいるんだろう。

1000 人以下かなあ? (2005 年現在)

処理系はどれがいいの?

GHC (http://www.haskell.org/ghc/) で決まりでしょう。

言語の最新バージョンはどれよ。

Haskell98 というのが最新です。

ライブラリはどのくらいあるの。

あんまりありません。 HaskellLinks にライブラリ集へのリンクがあるので見てください。

標準ライブラリが固まってないように見える。

hierarchical library という階層化されたやつが新しいもののようですね。

Perl の CPAN みたいのはないのかな?

なさげです。

んで結局普通のプログラムは書けるの?

簡単な UNIX コマンドを Haskell で書いた例が UnixCommandsInHaskell にあります。 またコンパイラの GHC は Haskell 自身で書いてあります。

モナドって何?

あまり答えたくありません。 この問いに答えてそれでわかる人は聞くまでもなくわかるし、 それでわからない人には意味がないからです。 モナドに関しては、「…とは何か」と考えるよりも 「どう使うのか」を考えるほうが幸せになれます。

じゃあ、モナドは何に使うの?

まず、リストはモナドです。 Maybe というデータもモナドです。 それから、パーサコンビネータと言って、 パーサをモナドで表現する使いかたがあります。 モナドについて考えるときはこの三つを中心に理解していくのがわかりやすいと思います。

そして最後に IO モナドがあります。 これは I/O をするときなど、副作用が発生する場合に使います。

副作用、あるんじゃん!

だからつっこんじゃだめなんだってば。

「Haskell は参照透明性が保たれているから凄いのだ」と聞いたのですが、参照透明性ってなんですか。

おもいきり簡単に言うと、副作用が起きないという性質です。

それっていいの?

いいという人もいますし、そのほうがいいプログラムもあるのです。

でもデカいデータの一部分だけを変更したいことってあると思うけど、そういうときは全部作り直すの?

基本的にはそうです。 ただし、IO モナドを使って一部だけ変更できるデータもあります。

そういうプログラムには Haskell は向いていないかもしれません。 しかしそういうプログラムばかりではありませんし、 ハードウェアが速くなれば問題にならないかもしれません。

メーリングリストとか、ある?

日本語のメーリングリストがあります。 http://www.sampou.org/haskell/ の案内を見てください。

Haskell プログラムって速いの?

動かすプログラムと、「速い」の基準によります。

しかし一般的には、カリカリにチューンした C よりは遅く、 Perl や Ruby などのインタプリタよりは速い、という感じです。

今の流行りはオブジェクト指向なんだよ、Haskell はオブジェクト指向じゃないからヤダ、とにかくオブジェクト指向にしてください!

O'Haskell というオブジェクト指向拡張があるみたいです。 -> http://www.math.chalmers.se/~nordland/ohaskell/

日本語の情報が少なすぎるぞゴルァ!

激しく同意! ぜひ自分でもサイトを作ってください。

ところで、なんで Haskell なんか使ってんの。

関数型ってなんとなくかっこよさそうだから。

loveruby.net というドメインのサイトで Haskell を扱うのはいかがなものか

心は Ruby なのでよいのです