2006-06-11
■ 所信表明

Haskellは、タイプクラスが面白そうだなあというのと、ちょっと前までタイプクラスタイプクラス連呼してた知り合いがいるのと、3年くらいモナドが理解できずに悔しいのと、誰かがなんかの拍子にHaskellのコードを書いたときに「さっぱり読めなくて悔しい」のくらいで気合を入れて勉強してみようと思いました。
■ IDE

まずはIDEのインストールから。Emacsとかmakeとかありえなーい。
「Haskell Visual Studio」とかでぐぐると404 Not FoundとかVHSとかがヒットする。どっちがいいかはわからないんだけど、Haskell Workshopとかに論文を出してるチームであるということと、あとは単純にもう一方が繋がらなかったので、Visual Haskellをインストールすることに。うちのVS2005なんだけど、入るかなー?
あれ?Haskell処理系はいいのかな?いや、これ入ってるのか。すげ
一度、FirefoxとかVirtualPCとかiTunesとか終了して試してみよう
⇒当然ダメ。よく読むと「なんかインストーラおかしいねんけど」と言っているように見える。なんなんだ。もう一度インストーラをダウンロードしてみることに。これでダメなら、VS2003じゃないとダメなんだと判断しよう。
ダメだ。
ところで
In order to use Visual Haskell, you need Visual Studio .NET 2003. Right now, this is the only supported version of Visual Studio - unfortunately we haven't yet added support for the 2005 Beta. The Express languages (Visual C++ Express etc.) also will not work, because they don't have support for plugins.
とかWebサイトに書いてあるのがちょっと面白いと思った。microsoft.comのメールアドレスだから、中の人じゃないかと思うのだが。中の人でもbeta版持ってないとかあるのかなあ…
うーむ、とりあえずmsi除くくらいならやってみてもいいと思ったし、中身をハックしても良いと思うし、そうするとHaskellグループなのになんかC#とかVBとかのコードが書き散らかされてて斬新な感じになると思っていたのだが、MSの中の人に対して「VSのコード見てやるからよこせ*2」というのはさすがにアレなので、やっぱり止めとこう。
が、やっぱりWebサイトに繋がらない。
EclipseFP - Functional programming support for Eclipseに行くべきだろうか。おお、haskellのほうは結構更新されてるじゃないか。よしよし。OCamlのほうは2年くらいメンテされてないっぽかったから、完璧に終わったプロジェクトだと思ってたんだが。こっちはGHCのインストールからしないとだめなのね…
ghcのインストールはこともなく終了。あ、このやろーc:\の直下に入れやがったな…
まずghciを動かしてきちんとインストールできてるか試すことに。
let a = 3
うは。何年か前はインタプリタでletできなくてぶちきれた記憶があるのだが、今はちゃんとできるのね。さすがさすが。んで、終了できなくてはまる、とorz。WindowsではEOFはCtrl+zだったか。
■ ふと気づいたこと

OCamlやSML#ではletの右辺は、変数の定義に先立って評価されます。そうしないと、右辺が多相レコードの式*3だった場合に、型が定められません。多相レコード型の自由変数の定義がメソッドの型を含むからです。
Haskellでは右辺は必要になるまで評価されません。つまり、型も定まりません。普通のML多相の範囲ではそこに型変数を割り当てておけばそれで型が付くのですが、多相レコード計算のようなStructural Polymorphism(構造的多相?)が入ると、自由型変数が必要になるのでそれではうまくいかないのです。
つまり、call-by-needのsemanticsを採用すると、型システムにも制限が加わるわけです。今まで気づかなかったんですが、これはちょっと面白いかも。
>call-by-needのsemanticsを採用すると、型システムにも制限が加わる
コレも本当でしょうか?どっちかというとHaskellには値多相がないので「より自由」な気がしてたんですが…(レコード多相をよく知らないので何とも言えない) Haskellの「制限」といえばmonomorphism restrictionかなとは思うんですが。もうちょっとOCaml勉強します。