(* by poly. variant *)
type t = [ `Person of string | `Integer of int ]
let show = function
`Person p -> p | `Integer i -> string_of_int i
let data = [ `Person "ogasawara";
`Integer 10 ]
let _ =
List.iter (fun t -> print_string (show t)) data
let show' = function
#t as t -> show t | `Float f -> string_of_float f
let data = [ `Person "ogasawara";
`Integer 10; `Float 22.0 ]
let _ =
List.iter (fun t -> print_string (show' t)) data
(* by object *)
class person name = object
val name : string = name method show = name
end
class integer i = object
val value : int = i method get = value method show = string_of_int i
end
class type showable = object
method show : string
end
let showable c = (c :> showable)
let data = [ showable (new person "ogasawara");
showable (new integer 10) ]
let _ =
List.iter (fun o -> print_string o#show) data