トップ «前の日記(2007-07-03) 最新 次の日記(2007-07-05)» 月表示 編集

日々の流転


2007-07-04 [長年日記]

λ. 『入門OCaml — プログラミング基礎と実践理解』

入門OCaml ~プログラミング基礎と実践理解~(OCaml-Nagoya)

OCamlには以前挫折したが、最近またOCamlを使いだしたので、この本を読んでいる。

関連

メモ。

p.60

直積型は、複数の型を積み上げて1つの型とすることを抽象化している。

積み上げる???

p.121 幽霊型の説明でいきなりconstraintキーワードってのが出てきて良くわからなかった。

あと、幽霊型と言われて私は James Cheney と Ralf Hinze の「Phantom Types」のようなものを想像したんだけど、違うのね。この論文を読み返したらこんな風に書いてあった。 なるほどなるほど。

The term phantom type was originally coined by Leijen and Meijer [17] to denote parameterized types that do not use their type argument(s). They use phantom types for type-safe embeddings of domain specific languages into Haskell. Their approach is, however, strictly more limited: while they can enforce type constraints when constructing values of a phantom type, they cannot make use of these constraints when decomposing a value. Our proposal exactly fills this gap.

p.157 「サブタイプへのキャストには “:>”演算子を使います」とあるけど、サブタイプではなくスーパータイプでは?

列多相(row polymorphism)。素朴な疑問なのだが、何故「行多相」ではなく「列多相」なのだろう?

p.161 の列多相性と比較されているJavaのコードが変。Javaでも(bounded polymorphism はあるし)普通に書けばダウンキャストは不要のはず。記述の簡潔さを除けば列多相の優位性を示せていないと思う。

class Base {};
class Sub1 extends Base { void cons(){} };
class Sub2 extends Base { void snoc(){} };

class Container<X extends Base> {
    X x;   
    Container(X x_) { x = x_; }
    X peek() { return x; }
};

Sub1 c = new Sub1();
Container<Sub1> container = new Container<Sub1>(c);
container.peek().cons();

Sub2 s = new Sub2();
Container<Sub2> container2 = new Container<Sub2>(s);
container2.peek().snoc();
Tags: ocaml
本日のツッコミ(全4件) [ツッコミを入れる]
ψ ogasawara (2007-07-05 16:37)

OCaml本の著者の一人の小笠原です、初めまして。読んで頂けて光栄です。<br>constraintキーワードの説明なくてすみません ToT;<br>定義はOCamlマニュアルのsection 6.8.1 type definitionsにありますが、要するに型変数の中身を制限できる機能です。<br><br>あと、row polymorphismのrowは、実はρ(ギリシャ文字のロウ)なのです。<br>see <br>http://www.math.nagoya-u.ac.jp/~garrigue/papers/variants.ps.gz<br><br>http://www.pllab.riec.tohoku.ac.jp/~ohori/research/toplas95.pdf<br><br>これらの論文に出てくるrow variableのことを(一般的に?)列変数と訳すようなので、row poly.は「列多相」かなーと思い、このように訳しております。

ψ KeisukeNakano (2007-07-05 23:19)

Wand や Remy による row variable の row は,<br>relational detabase の用語から来てるのではないでしょうか?<br>ρ ならスペルは rho でしょうし.<br>で,なぜ行じゃなくて列かという話についてですが,<br>row variable を列変数と最初に訳したのは<br>共立出版の大堀先生の教科書だったと思います.<br>昔,理由を聞いたような気がしますが忘れてしまいました.<br>行変数では据わりが悪いからといったところでしょうか.

ψ さかい (2007-07-06 22:02)

ogasawaraさん、はじめまして。<br>気になった点ばかり書いてしまいましたが、良い本だと思います。<br><br>> constraintキーワードの説明なくてすみません ToT;<br>> 定義はOCamlマニュアルのsection 6.8.1 type definitionsにありますが、要するに型変数の中身を制限できる機能です。<br><br>型パラメータとして許される型に制限を与える機能であるという説明はありましたし、流石にそれは理解できました。<br>良くわからなかったのは、むしろ何故「constraint 'a = [< `Naked| `Taxed]」が「型パラメータとして許される型を`Naked型(税なし)か`Taxed型(税込み)のどちらかに限っている」ことになるのかという点で、要は制約の文法と解釈がわからなかったのだと思います。<br>後で読み返して気付いたのですが、これ多相ヴァリアントだったんですね。<br><br>> あと、row polymorphismのrowは、実はρ(ギリシャ文字のロウ)なのです。<br>> see <br>> http://www.math.nagoya-u.ac.jp/~garrigue/papers/variants.ps.gz<br><br>綴りに関してはKeisukeNakanoさんも指摘してますが、この論文には「First, we use sorted types: there are three kinds of type variables, α for usual types, ι for presence information, and ρ for row variables.」と書かれているだけで、この書き方は「rowはrで始まるからその型変数はρで表してみた」というノリだと思います。

ψ さかい (2007-07-06 22:53)

KeisukeNakano さん、こんにちは。<br>情報ありがとうございます。<br><br>> Wand や Remy による row variable の row は,relational detabase の用語から来てるのではないでしょうか?<br><br>なるほどー。<br>言われてみると、確かにそれはしっくり来ますね。<br><br>row variable の出典っぽい<br>Wand, M. 1988. Corrigendum : Complete type inference for simple object. In Proceedings of the 3rd IEEE Symposium on Logic in Computer Science. IEEE, New York, 132.<br>には書いてあるのかなぁ。<br><br>> 行変数では据わりが悪いからといったところでしょうか.<br><br>大堀先生……(笑<br># 関係データベースの分野では、行変数という訳もあるようなので、それに合わせてくれれば良かったのに。