#ocamlbook#

Legend †

OiC
公式Ref. Chapter 3 Objects in Caml
CaM
公式Ref. Chapter 5 Advanced examples with classes and modules

オブジェクト指向機能 (担当:末次,樋口) †

クラス †

基本構文 †

  • ベースあり -- 2007-02-14 (水) 17:28:50

生成パラメータ †

  • OiC 3.10? -- 2007-02-14 (水) 17:33:02
  • 今いじってます -- ヒグチ? 2007-02-15 (木) 00:45:07
  • TODO 直接生成のお話、constraintの話 -- ヒグチ? 2007-02-15 (木) 02:19:25

自己参照 †

  • OiC 3.3 -- 2007-02-14 (水) 18:01:19
  • coercion触れるのここかも -- ヒグチ? 2007-02-15 (木) 02:55:44
  • 継承の後じゃないと、外部に参照できる形でさらせないよが言えない? -- 2007-02-15 (木) 12:35:16

メソッドのprivate指定 †

  • OiC 3.6 -- 2007-02-14 (水) 18:01:35
  • 例案だけ配置 -- ヒグチ? 2007-02-16 (金) 01:47:09

initializer †

  • OiC 3.4 -- 2007-02-14 (水) 18:01:44
  • 生成パラメータ直後に移動してみた -- ヒグチ? 2007-02-16 (金) 01:47:29

クラスの応用 †

継承 †

  • ベースあり -- 2007-02-14 (水) 17:29:03
  • OiC 3.8 -- 2007-02-14 (水) 18:02:07

オーバーロード †


多重継承 †

  • OiC 3.9 -- 2007-02-14 (水) 18:02:46

virtualメソッドによる遅延バインディング †


型パラメータ付きクラス †


オブジェクト †

直接生成 †

  • ベースあり -- 2007-02-14 (水) 17:29:13
  • OiC 3.2 -- 2007-02-14 (水) 18:03:10

多相性 †


多相性-構造的サブタイピング †

  • www.math.nagoya-u.ac.jp/~garrigue/papers/ocaml-ng.pdf -- 樋口? 2007-02-14 (水) 16:31:44
  • ↑ガリグ先生によるパワポ資料で少し言及されてる様子 -- 2007-02-14 (水) 16:33:12

多相性-ρ多相 (rho variable polymorphism?) †

大堀先生の論文他を超斜め読みした理解はこんな感じなのですがどうでしょう.

# let c = object
   val lst = []
   method cons x = {< lst = (x::lst) >}
   method length = List.length lst
  end;;
val c : < cons : 'b -> 'a; length : int > as 'a = <obj>
# let s = object
   val lst = []
   method snoc x = {< lst = (List.append lst [x]) >}
   method length = List.length lst
  end;;
val s : < length : int; snoc : 'b -> 'a > as 'a = <obj>

上記のようなintを返すメソッドlengthを持つという共通点を持つオブジェクトc,sがあったとし,

# let tupler o = (o#length,o);;
val tupler : (< length : 'b; .. > as 'a) -> 'b * 'a = <fun>

上記のようにメソッドlengthを持つオブジェクトをいじる関数を定義.
tuplerの型中の..をとりあえず,無視して読むと,
lenthを持つ何か -> (何か,lengthを持つ何か)
というシグネチャで,戻り値の2要素目はlengthを持つという情報以外を失っているように見える.
しかし,

# (snd (tupler c))#cons 1;;
- : < cons : int -> 'a; length : int > as 'a = <obj>
# (snd (tupler c))#snoc 1;;
This expression has type < cons : 'b -> 'a; length : int > as 'a
It has no method snoc

ちゃんと,cから作った(snd (tupler c))はconsを持っているものという情報をロスしておらず,

# (snd (tupler s))#cons 1;;
This expression has type < length : int; snoc : 'b -> 'a > as 'a
It has no method cons
# (snd (tupler s ))#snoc 1;;
- : < length : int; snoc : int -> 'a > as 'a = <obj>

sに関して同様の操作を行ったこの例からわかるように,
先ほどは(snd (tupler c))にconsを先に適用した結果,
consを持つものとされたのでなく, tuplerに渡されたオブジェクトの情報が隠れた形で保存されている.

この隠れた情報保持している裏方さんがrow variable(rho variable) とやらで,
こういったpolymorphicなものが記述できてハッピーだ.
というのが,ρ多相という認識でOKでしょうか?


すばらしい、数時間で完璧に理解されていますね。私がρ多相を理解するのに何日かかったと思っているんですかっ :) あと、実用上は、情報のロスを防げるだけではなく、明示的なサブタイピングのように キャストを記述しなくてもいいという点も、便利なところだと思っています。 上記の例でそのまま5章の内容にできますね。よろしくお願いします。

ところで、row variablesについて理解できると、実は、特定のコンストラクタだけ ファンクターの引数にして輸入できるprivate rowsの機能も容易に理解できます。 ついでに理解しておくと役立つと思います。


  • row variablesについては、大堀先生の A Polymorphic Record Calculus and Its Compilation が分かりやすいと思います。 -- ogasawara? 2007-02-14 (水) 16:36:55
  • 要するに、let name c = c#name という事が出来る多相性です。これはSML#の多相レコードや多相ヴァリアントの元となる考え方です。 -- ogasawara? 2007-02-14 (水) 16:38:00
  • ↑↑↑コメントありがとうございました。補強整形して5章に加えます。 -- ヒグチ? 2007-02-15 (木) 02:23:14

この章のどこかで触れなきゃって事項 &dagger;

  • coercion -- 2007-02-15 (木) 02:43:55

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS