On Sun, 2005-07-24 at 14:08 -0700, Stephane Glondu wrote: > BTW, I was talking about 'a array option, not 'a option array. You can use > (mostly of) the implementation of Buffer, hence have the same > efficiency... I don't understand your point about "efficiency". If you > think that the Buffer implementation is not efficient, I may agree with > you, but this is an algorithmic issue, not a typing issue. Observe the constructor: let create n = let n = if n < 1 then 1 else n in let n = if n > Sys.max_string_length then Sys.max_string_length else n in let s = String.create n in {buffer = s; position = 0; length = n; initial_buffer = s} creates an *uninitialised* string of length n: "val create : int -> string String.create n returns a fresh string of length n. The string initially contains arbitrary characters." If you have to initialise the store, it is expensive, and if you have to provide a dummy value it is hard to use. If you used a 'a array option, and assert (match Some a -> Array.length a > 0 | None -> true) then you can use the first value of the array as the dummy value for the rest of the array, and avoid Obj.magic -- however this is very inefficient, since the dummy would have to be changed in many places whenever the first entry in the array changed (and that isn't just a store -- there is a write-barrier to think about .. :) That won't happen in Buffer because you can't modify it, but it must be allowed in more general variable length mutable array. -- John Skaller