soutaroのHaskellにっき

2006-06-11

ふと気づいたこと ふと気づいたこと - soutaroのHaskellにっき を含むブックマーク はてなブックマーク - ふと気づいたこと - soutaroのHaskellにっき

OCamlやSML#ではletの右辺は、変数の定義に先立って評価されます。そうしないと、右辺が多相レコードの式*1だった場合に、型が定められません。多相レコード型の自由変数の定義がメソッドの型を含むからです。

Haskellでは右辺は必要になるまで評価されません。つまり、型も定まりません。普通ML多相の範囲ではそこに型変数を割り当てておけばそれで型が付くのですが、多相レコード計算のようなStructural Polymorphism(構造的多相?)が入ると、自由型変数が必要になるのでそれではうまくいかないのです。

まり、call-by-needのsemanticsを採用すると、型システムにも制限が加わるわけです。今まで気づかなかったんですが、これはちょっと面白いかも。

*1OCamlオブジェクトとかPolymorphic VariantとかSML#のレコードとか

syd_sydsyd_syd2006/06/13 14:00お久しぶりです。
>call-by-needのsemanticsを採用すると、型システムにも制限が加わる
コレも本当でしょうか?どっちかというとHaskellには値多相がないので「より自由」な気がしてたんですが…(レコード多相をよく知らないので何とも言えない) Haskellの「制限」といえばmonomorphism restrictionかなとは思うんですが。もうちょっとOCaml勉強します。

soutarosoutaro2006/06/13 14:58ウソだと思いますorz(本当かもしれませんが、積極的に主張するつもりはありません。)