There are two conceptual errors here:<p>(0) Rust doesn&#x27;t really have much support for abstract data types. What Rust has is something not too unlike Haskell: you can hide `struct` fields [though not `enum` constructors], but the `struct` remains concrete. With a bona fide abstract data type mechanism, as in ML, you can give a module a <i>signature</i> that reveals the existence, but not the representation, of its type components. I&#x27;m guessing this much representation hiding isn&#x27;t fully compatible with Rust&#x27;s goals, which require knowing the sizes of types statically, unless they&#x27;re behind a layer of indirection.<p>(1) Abstract data types have no relation whatsoever to type inference. [Nor do algebraic data types for that matter.] An abstract data type is an existential type: a dependent pair consisting of a type `T`, and a value whose type is `F T`, for some type function `F`. The closest thing Rust has to existentials is trait objects, but these can&#x27;t do everything that existentials can do.