I think I've gotten everything pretty much straightened out now, but there is something I didn't expect with GADTs and pattern-matching. Using my previous samplerate_t type: type mpeg1_t type mpeg2_t type _ samplerate_t = | S48000 : mpeg1_t samplerate_t | S44100 : mpeg1_t samplerate_t | S24000 : mpeg2_t samplerate_t | S22050 : mpeg2_t samplerate_t I can't seem to do something like this: let samples_per_frame : type id. id samplerate_t -> int = function | S48000 | S44100 -> 1152 | S24000 | S22050 -> 576 Instead I have to have each of the constructors use a separate branch: let samples_per_frame : type id. id samplerate_t -> int = function | S48000 -> 1152 | S44100 -> 1152 | S24000 -> 576 | S22050 -> 576 even though S48000 and S44100 are the exact same type! OCaml complains: Error: This pattern matches values of type mpeg1_t samplerate_t but a pattern was expected which matches values of type id samplerate_t I certainly don't know a lot about these new type features, but I know there shouldn't be a limitation in what I'm doing with them here. Is there any way to tell the typing system to let me combine the branches? -- รง