osiire’s blog

ふしぎなそふとやさん

知ってる?OCamlのオブジェクトってね...

多相レコードなんだ!普通のレコードって多相にならないよね!?例えば、

# type person = { name : string; age : int };; (* person型 *)
type person = { name : string; age : int };;
# type car = { name : string; doors : int };; (* car型 *)
type car = { name : string; doors : int };;
# let get_name x = x.name;; (* 名前を得る関数 *)
val get_name : car -> string = <fun>

nameという要素がperson型とcar型で重なっているのに、get_name関数はcar型に固定されちゃった。これじゃ多相じゃないね!ところが、オブジェクトなら...

# let get_name x = x#name;;
val get_name : < name : 'a; .. > -> 'a = <fun>

ほら!get_name関数の引数は、nameという要素を持つ何かという型付けになったよ!だから、

# class person = object 
    method name = "osiire"
    method age = 20 
  end;;
class person : object method age : int method name : string end
# class car = object
    method name = "wish"  
    method doors = 4
  end;;
class car : object method doors : int method name : string end
# get_name (new person);; (* get_nameをperson型で使う *)
- : string = "osiire"
# get_name (new car);;  (* get_nameをcar型で使う *)
: string = "wish"

get_name関数はperson型でもcar型でも使えるんだ!多相だね!
ちなみに、この型付けの仕組みを世界で最初に考案したのは日本人(大堀先生)で、先生が手がけているコンパイラSML#ではまさに多相レコードとして応用されているんだ。大堀先生に感謝だね!それじゃ!