未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

Haskell

入門Haskell―はじめて学ぶ関数型言語

入門Haskell―はじめて学ぶ関数型言語

を買った。読んだ。良く分からない。orz 入門書のせいにしてしまう。
この本に言及している日記が20個くらいある。Haskellを含む日記もここにきて急上昇の感がある。http://d.hatena.ne.jp/keywordstats/Haskell で言及数をみてもそれがうかがいしれる。YAPCと比較すると、YAPC以降来ている。わたしもその口だ。
http://www.sampou.org/cgi-bin/haskell.cgiにいろいろな情報へのリンクがある。
まづ、About Haskellの翻訳。http://web.yl.is.s.u-tokyo.ac.jp/~ganat/memo/aboutHaskell.html

qsort []     = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
                 where
                   elts_lt_x   = [y | y <- xs, y < x]
                   elts_greq_x = [y | y <- xs, y >= x]

なんとなく、すごい。簡潔である。言うまでもなくクイックソートである。どのようにクイックソートをするということを記述するというよりもむしろ、クイックソートというのは、先頭の要素xより小さいすべての要素をソートしたものと、xそれ自身と、先頭の要素より大きいものをソートしたものを結合したものである、という性質(?)を宣言したようなものになっている。あ、そうそう、空の場合はソートすると空。この説明にはクイックソートと言うものがどのようなアルゴリズムかという知識を前提としているが、それがあれば上記の説明は理解できると思う。ちゃんとクイックソート位の事は勉強しておこう。(大学でも独学でもいいけど、アルゴリズムの基礎的な教養である)

Cと言えば(余談)

ちなみに、プログラミング言語の入門書で最初の例がなにがなんでもHello World!であるというのは、K&Rからの悪しき慣習である。

プログラミング言語C 第2版 ANSI規格準拠

プログラミング言語C 第2版 ANSI規格準拠

を素人に薦めている人の、例えば、「Cを勉強するなら迷わず買うべきです。」なんて言葉はうかつに信じてはいけない。わたしなら「買ってもいいけど、本棚の肥やしにすべきで、最初に読むべき本ではありません。」くらいな事は言う。
ついでにCに対する罵詈雑言を昔の日記から発見したので、忘れないように貼っておく。96年2月20日の「ソースコードを読むほど忙しい」である。
http://web.archive.org/web/20001016090124/www.best.com/~yoshioka/d/96/02/i960220.html

ついでにいっちゃうとC言語に関しても怒素人です.あ,おこっちゃいけません.カーニハン先生らのC言語入門ちゃんと読んだことないです.だから今手元に先生の第2版を置いて勉強してます.The C Programming Language, Second Edition, B W Kernighan, D M Ritchie, Prentice Hall,1988,

でいきなり22ページです.配列でいきなりつまづきました.

while ((c = getchar()) != EOF)
    if (c >= '0' && c <= '9')
	++ndigit[c - '0'];
...

うわーここにもASCIIばりばり.ASCII以外の文字コード考えていない.そりゃそーだよね.ふつーそーだ.Cを発明した人が考えていないのだもの下々のプログラマがASCII以外の事考えなくても不思議ないよね.Cなんか使っていると頭悪くなりそうなんで使いたくないのだけどこれも三十半ばで宗教を変えた者としては致し方ないですね.職業ですから使いますけどホントはどーにかしてほしいと思ってます.

でも,この手のものは一文字が7ビットであるとか,文字の並びはASCIIであるとか,文字の種類を128とか256とか決め打ちしたアルゴリズムとか,ソースコード文字集合は実行時の文字集合と等しいであるとか,ファイルコードはプロセスコードと等しいであるとか,ありとあらゆる思い込みというか暗黙の仮定の一つなわけで,それがプログラムの拡張性を著しく損なっているというのは80年代に日本語化とかそーゆー力技をしてきたわたしの感想なわけですね.

この手の仮定をすべてとっぱらってプログラムのなかには文字集合に関する知識/情報を埋め込まないというのが,文字集合独立なプログラムの考えなわけで,一度そーゆージェネリックなプログラムを作れば新しい文字集合をサポートしなくちゃいけなくなった時,プログラムの修正なしに,サポートできてうれしいなと.そーゆーことを80年代に学んだわけだけど,実践の道は遠いのです.

ソースコードを批判的に鑑賞するというのは自分の歩んできた道を反省しながら振り返るという作業でもあるわけで,学ぶところはとっても大きいのでした.

そうそう、YAPCRubyのまつもとさんも言っていたけど文字集合独立(Character Set Independent)重要です。
余談終わり。

で宣言的とは

Cは高級アセンブリ言語みたいなものだからノイマン型コンピュータを使っている限りその呪縛から逃れなれない。最近ではRISCの流れ(?)でアセンブリ言語で記述した順番にとらわれないでOOO(Out of Order)で実行したりするけど。
Haskellはその点、実行順とプログラムの記述の順番は独立である。関数型言語と関係があんまりなさそうにさえ思えるデータベースの検索言語SQLですら実行の順番ではなく、「何」を宣言的に記述する。
これが何でいいのかというと、コンピュータが人間に代わって、最適化を行えるのである。そのために最適化に対する知見が深まれば深まるほど自動的に性能が向上するのである。Cで書いていたらコンピュータが速くなる以上速くならないが、Haskellのような宣言的に記述する言語であれば、処理系の最適化処理が賢くなればなるほど、性能が向上するのである。素晴らしい。
SQLの実装の歴史というかRDBMSの実装の歴史はまさに処理系の最適化の歴史である。この30年間Coddがデータベースにおける関係モデルを発表以来、DBMSの研究の非常に太い幹は処理系の最適化の歴史と言ってもいい。その性能向上はコンピュータの性能向上をしのぐ。

Why does Haskell matter?(英語)を読もう。

今日時点、モナドについては全然理解していない。orz