let p s n = print_string (s^string_of_int n^"\n"); flush stdout (*version 1*) class ['a,'b] acc f init = object val mutable v = (init:'a) val func = (f:'a -> 'b -> 'a) method app x = let newX = func v x in v <- newX;newX end let f1 = new acc (+) 0 let _ = p "f1:" (f1#app 1) let _ = p "f1:" (f1#app 1) let _ = p "f1:" (f1#app 1) (*version 2*) class ['a,'b] acc' f init = object inherit ['a,'b] acc f init method init x = v <- x end let f2 = new acc' (+) 0 let _ = p "f2:" (f2#app 1) let _ = p "f2:" (f2#app 1) let _ = p "f2:" (f2#app 1) let _ = f2#init (-5) let _ = p "f2:" (f2#app 1) let _ = p "f2:" (f2#app 1) let _ = p "f2:" (f2#app 1)