osiire’s blog

ふしぎなそふとやさん

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

レコードと高階関数で書けるんだ!TAPLに載ってるのを読んで、へー(×2)と思ったので紹介するね!*1

# type t = { mutable name : string; mutable age : int };;
type t = { mutable name : string; mutable age : int; }
# type m = { 
  get_name : unit -> string; 
  get_age : unit -> int; 
  birthday : unit -> unit };;
type m = { get_name : unit -> string; get_age : unit -> int; birthday : unit -> unit; }
# let obj = 
   let self = { name = "osiire"; age = 20; } in
   { get_name = (fun () -> self.name);
     get_age = (fun () -> self.age);
     birthday = (fun () -> self.age <- self.age + 1;) };;
val obj : m = {get_name = <fun>; get_age = <fun>; birthday = <fun>}
# obj.get_name ();;  (* ここからがオブジェクトっぽい *)
- : string = "osiire"
# obj.birthday ();;
- : unit = ()
# obj.get_age ();;
- : int = 21

まさに「だから何?」というトリビアだね!じゃ!

*1:別に今日読んだ訳じゃないんだけど