3 ms·
I'm probably way in over my head with making a good case for how this resembles dynamic languages, but what I had in mind was trait objects. You can box a struc
by eloisius 5y ago
I'm probably way in over my head with making a good case for how this resembles dynamic languages, but what I had in mind was trait objects. You can box a struct and refer to it as a trait object (aka type erasure). Thereafter, the receiver doesn't care _what_ concrete implementation it gets, just that it implements a certain trait.
- lmm 5y agoYeah that's traditional subtyping, not a dynamic language thing at all.
- 4ad 5y agoRust traits are not subtyping, Rust's type system is principal (although with subtyping you could achieve the same thing as described by the OP, e.g. in C++, C#, etc, which only have subtyping but no existentials exposed as a syntactic feature).
- lmm 5y agoThe only reason trait objects aren't subtyping is that impl trait is not a first class type in Rust. They behave like subtyping in this context.
- 4ad 5y agoWhat you describe are existential types, a feature that every statically-typed language with parametric polymorphism has, either through some explicit syntactic feature (Rust traits, Haskell type classes, ML modules), or even without, as from basic logic and the Curry–Howard correspondence you can always encode an existential using universals. ∃a.P(a) ----------------- Remove-Exist ∀b.(∀a. P(a)→b)→b Some static languages had existentials even before they got parametric polymorphism (Go interfaces). This is why we could do so much in Go without generics!