self quiz

なぜ、このプログラムは型エラーになりますか?

# class c = object (self)
    method f = (new d)#f self
  end and d = object 
    method f : c -> unit = fun x -> ()
  end;;
This expression has type < f : 'a; .. > but is here used with type 'b
Self type cannot escape its class

selfの型は< f : unit; .. > (= #c)で、d#fの引数の型はc。このとき、#ccは単一化はできるけれども、selfの型は常に拡張可能でなくてはいけない(継承があるから)ので、#ccの代入はできない。

単一化できずに型エラーになっているのではなく、単一化のあとの代入(?)でエラーになっているのだと思う。よく見るとエラーメッセージもいつものと違うし。

やっと理解できたぞ。