In reply to @sys64 "Variants vs inheritence, which": if youre extending some type with extra features but still want to use it as the original type in some circumstances you use inheritance. this is subtyping. if you want want a type to contain different types and do something different depending on it you use variant types. and if youre using recursive types youll want variant types. just looking at your synthesizer thing I assume you want inheritance. https://en.wikipedia.org/wiki/Subtyping https://en.wikipedia.org/wiki/Tagged_union https://en.wikipedia.org/wiki/Algebraic_data_type