patrón newtype
Envolver un tipo existente en un tipo nuevo y distinto sin overhead en tiempo de ejecución — para que el compilador pueda distinguir UserId(u64) de OrderId(u64).
Sintaxis de Haskell: newtype UserId = UserId Int. Rust: struct UserId(u64); (tuple struct). Se diferencia de un alias de tipo (type UserId = u64) porque el compilador crea un tipo nuevo — no se puede pasar por error un id de pedido donde se espera un id de usuario. Puede implementar sus propias instancias de trait/typeclass. Coste cero — compila al mismo código que el tipo primitivo desnudo. Técnica estándar en Rust/Haskell/F# para "domain modelling" y para evitar la "obsesión con primitivos".