トップ 最新 追記

follow ikegami__ at http://twitter.com

イネムリネズミ日記

いけがみを召喚するには、出現予定を参考にしてください。三週間前までにメールをくだされば、日程を追加するなどしてスケジュールに組み込むことができるかもしれません。勉強会や個人的な会合、中途採用面接などに応じます。日記に書かないことはこちら

2003|04|05|06|07|11|12|
2004|01|02|03|04|05|06|07|10|11|
2005|01|02|03|04|05|06|07|08|11|
2006|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|11|12|
2010|03|04|12|
2011|02|03|04|06|08|09|10|

2009-05-03 水芭蕉の変わらぬ美しさ [長年日記]

_ Haskell のまなびかた(2009-05-03版)

わたしがはじめて Haskell の処理系を触ったのは 2004 年の春ですから、もうかれこれ 5 年の歳月がたったことになります。はやいものだなあ。当時に比べて書籍もサイトも充実してきたので、学びやすくなったとは思います。

しかし、GHC がデファクトスタンダードになりましたが、GHC の変化が著しいこと、GHC が *nix 以外のプラットフォーム(つまり Windows や MacOSX など)でバグが多いこと、ライブラリが爆発的に増えた一方でその依存性を解決する方法がまだ確立していないことなど、現在でも Haskell が使いやすい言語になってはいないと、いけがみは考えています。

そもそも、Haskell は言語自体が簡単に習得しやすいものではありません。特に、関数型言語を触ったことがない人にとっては、Haskell は難しい言語だと感じることでしょう。

Haskell 98 Language Report を初学者が見てわかりやすいとは言えないうえ、これでプログラムを書くにはあまりにも制限がありすぎて(ということを初学者は最初に気がつかない)、一方で便利である GHC 拡張機能は理解するのが簡単ではないと思います。

Shelarcy さんが連載している記事『本物のプログラマは Haskell を使う』は、私が知る限り唯一の、日本語で GHC 拡張機能を説明し続けているすばらしいドキュメントですが、これがわかりにくい、またはわからない人もいるかもしれません。明日開かれる、『本物のプログラマは Haskell を使う』読者の集いで、参加者の皆さんと Shelarcy さんの両方が親睦を深めるだけでなく、お互いに得るものがあることを期待しています。

さて、書籍に関してはこのサイトでいくつか紹介しましたので(まだ紹介していないものもありますが、専門性の高いものばかりなので躊躇しています)、このエントリでは「現状における」Web での Haskell を学ぶ方法について紹介します。

_ Haskell のまなびかた(2009-05-03版) その1 : 英語の読解力をつける

日本語に期待するのはやめましょう。「えー」という声が聞こえてきそうですが、日本語に期待するのはやめましょう。あくまで、現時点での意見ですが、GHC の変化に追随していくためには英語を読む能力が必要です。

日本語の Haskell Wiki サイトや、日本語の Blog で Haskell について紹介してくださっている方々はおおぜいいますが、英語から日本語への翻訳はとても労力を要します。しかも GHC は平気で下位互換性をなくしますので、せっかく書いてくださった文章が、後世、役に立たなくなったりします。これは日本語に限った問題ではなく、英語のドキュメントでも同じことですが、現時点での英語ユーザが多いため、古いものは Google rank がどんどん下がります。

つまり、英語さえ読めれば後で紹介するように、頻繁に更新される良いドキュメントを把握することができるというわけです。

さらに、英会話もできるようになれば IRC freenode の #haskell にて親切な方々に相談することができます。「明示的に型を書いていない数字 1 が Integer になっているみたいなんだけど、なんで?」とか、「-fglasgow-exts ってなんですか」みたいな、もう相当初心者的な質問にも優しく答えてくれます。メーリングリスト haskell-beginners も同様です。購読しなくても、アーカイブを検索すれば困っていることが解決するかもしれません。

_ Haskell のまなびかた(2009-05-03版) その2 Haskell 学習サイト

では、私が知る限りの Haskell 学習サイトを紹介します。ただし、英文読解力必須です。それから、最新の stable な GHC もインストールしておきましょう。

Haskell 公式サイトからたどる

公式サイトの左側には Learning という列があります。そこからたどるといろいろなサイトがあります。

言語の習得の難易度は、個人差があります。持っている背景知識によって、ある人によっては簡単なことが、別な人には難しいこともよくあることです。自分にあったサイトを、公式サイトから探してみてください。

Learn You a Haskell for Great Good!!

このサイトはまだ未完成ですが、わたしが自信をもってお勧めします。このサイトは、さきほど書いた、公式サイトの Learning Haskell からすでにリンクされています。

Learn You a Haskell for Great Good!! の特徴は、著者 Miran Lipova\v{c}a 氏(\v{c}はcの上にvがつく文字)のイラストがかわいいことです。あと、できるだけ前提知識を必要としないで理解できることを目指しているそうです。さらに、最新の GHC 拡張機能を、初心者向けに説明しています。

しかも、なんと Monad の説明がありません(現在鋭意執筆中)。Monad の理解抜きでも、Haskell を学びたかったらここがよいと思います。が、Haskell の本当の威力を発揮するのは Monad 特に State Monad だと考えていますので、いずれは避けて通れないと思うのですが、まあ普通のプログラムを書くのに Monad を使わないというのも現実的でいーんじゃないでしょうか。IORef とか。

How to write a Haskell program - HaskellWiki

このサイトは、一通り Haskell を書けるようになった後、アプリケーションやライブラリなどをどのように公開するかの慣習を説明しています。必読です。

_ Haskell のまなびかた(2009-05-03版) その3 Reddit - Haskell を見る

最新の Haskell 情報は、ブログなどで頻繁に報告されています。新しいライブラリを作ったとか、こういうテクニックがあるよ、などという情報は Reddit を観察すると良いでしょう。さらに、Reddit にはポイントとコメントという機能があります。ポイントが高いリンクは、大勢の人から良いとされているサイトです。また、コメントを読むと、さらに情報が増えます。コメントにもポイントがあり、良いコメントは高いポイントを得ます。

Twitter には @reddit_haskell というアカウントがあります。これを follow すると、最新のポストがタイムラインに流れます。Twitter 中毒の人にお勧めします。

_ おわりに

本当は、日本語の文献が充実したほうがいいに決まっています。でも、現実を見れば英語の読解力があったほうがいろいろと都合がいいのです。このサイトでも日本語での発信を続けますが、まあ、僕も Haskell に飽きてしまう日が来るかもしれませんし。

どうやって、英語の読解力をつけるかですが、まず、単語について、いけがみは「英英辞典」しか使わないことを勧めます。英和にたよってはいけません。ましてや、自動翻訳などもってのほかです。私は dictionary.com をよく使います。フレーズについては、これはもう最適解はないと思うのですが、最後に、いけがみにとって役に立っている単行本を挙げて、このエントリをおわることにします。Haskell は面白い言語なので、一緒に話ができる人が増えることを期待しています。


2009-05-29 石斛、あなたはわたしを元気づける [長年日記]

_ ふつうでない Haskell の学び方:なぜ「遅延する」関数型言語は重要か

John Hughes の書いた "Why Functional Programming Matters" という、とても魅力的な文章があります(邦訳は nobsun がしてくださいました 『なぜ関数プログラミングは重要か』)。

この文書のなかで、 John は「遅延評価」がプログラムのモジュール化に貢献することを述べています。また、アルゴリズムを遅延的に書くことで実行効率があがることもあるということを指摘しています。

ところで、一方でこういう有名なプログラミングに関するジョーク(にしては、とても気合が入っている)をご存知の方もいることでしょう : "The Evolution of a Haskell Programmer", Fritz Ruehr, Willamette University,2001-08-01.

このページは、さまざまな「階乗」を計算するプログラムを紹介しています。階乗とは、自然数 n が与えられたときに、 n * (n-1) * ... * 2 * 1 を計算することです。

ここに告白しますが、僕は 5 年以上 Haskell でプログラミングしてきたにもかかわらず、このページの最後から二番目の階乗計算アルゴリズムが何をしているかまったくわかりませんでした。これは、4/18 に行われた型レベルプログラミング(の参加記) に代表されるような、型を用いた計算なのですが、それ以上のことはわからないままでいました。

型レベルプログラミングの会に出て以来、もう一度、型で行う計算について学びたくなりました。型で行う計算の最大のメリットは、「言語内DSLをコンパイル時に検査することができる」という点にあると考えています。さもなければ、型を用いない普通のプログラミングのほうが、一般的に実行効率がいいです。data Nat = Zero | Succ Nat のように自然数を定義して計算するのでは、いかにも遅そうですよね?しかし、その一方でコンパイル時にある種の正しさを検査することができるし、プログラミングと数学的帰納法が出会う瞬間というのは楽しいものです。使わなくても、知ってはおきたいと前から考えていました。

Richard Bird and Oege de Moor, "Algebra of Programming" (Prentice-Hall International Series in Computer Science),1997. という、今では手に入りにくい本があります。この本はあわせて 10 章からなるのですが、2 章の 50 ページくらいまで読んだところで、 The Evolution of a Haskell Programmer : Post-doc Haskell programmer の手法が丁寧に説明してありました。

ついでに、型レベルプログラミングの会の参加者の一部で盛り上がった「型による計算で filter :: (a -> Bool) -> [a] -> [a] を書くことができるか?」という問題がありました。Bird and Moor 本では、例としてとりあげていて、次のことが書いてあります:

filter p = concat ・ listr (p → wrap, nilp) = foldr (nil, (p → outl -> cons, wrap)) = listr ・ outl ・ filter outr ・ zip ・ pair (id, listr p)

[filter にまつわる公式 in Richard Bird and Oege de Moor, "Richard Bird and Oege de Moor, Algebra of Programming"より引用]

引用の範囲を超えるので、それぞれの部品 ((p → wrap, nilp) は The McCarthy Conditional form というそうなのですが、たとえばそういうこと) についてはいまは説明しませんが、この公式を知っていれば、あるいは思いつけば、「型によって filter は書くことができるか否か」に一応の決着をつけることができます。というのは、ほとんどの部品は、型でプログラミングできるからです。fold と再帰的定義の力は偉大だった。

まとめると、Richard Bird and Oege de Moor, "Algebra of Programming" (Prentice-Hall International Series in Computer Science),1997. という本はすごくて、The Evolution of a Haskell Programmer : Post-doc Haskell programmer になれたり、スーパー型レベルプログラマになれる(かもしれない)という紹介でした。この本に書かれているプログラムをするには、「遅延する」関数型言語が必要である。Haskell に至るのに、こういう入り口もあるのだ。

Zhenjiang Hu 先生の授業では今でも用いられているらしいのだけれど、出席してみたいものである。どうやら来るところを間違えてしまったらしい。

もう絶版らしいので、生まれてはじめて自炊した。とてもおいしくできた。

_ Richard Bird and Oege de Moor, "Algebra of Programming", Prentice Hall, 1997. が平均的な給付金で買える件について

[2009-06-04 追記]絶版じゃないよって @uskz さんから、教わりましたon-line, on-demandのピアソンで買えます!ふつうでない Haskell プログラマを目指すには、この道からいってみよう!


出現予定(召喚方法 ikegami@madscientist.jp):

RSS feed を再開しました。RSS の思想を尊重するために全文配信はしません、あしからず。