11 ms·
> the presence of an implicit conversion rule `T -> T?` amounts to the observation that `T <: T?`, where <: is the subtyping relation So you assert that number
by masklinn 2y ago
> the presence of an implicit conversion rule `T -> T?` amounts to the observation that `T <: T?`, where <: is the subtyping relation
So you assert that numbers and strings are the same type because PHP and Javascript will implicitly convert back and forth? That any C++ implicit constructor creates a subtyping relationship?
> I don't think any language allows this
Rust, Swift, Zig, just off the top of my head. C# too, value types is where and why it first introduced explicit nullability (back in C# 2.0).
- zarakshR 2y ago> because PHP and Javascript will implicitly convert back and forth If you can provide (valid!) methods `T -> U` and `U -> T` for two types, why wouldn't `T = U` hold? (Atleast for types where `=` makes sense) This is the definition I am using: > S is a subtype of T, written S <: T, if a value of type S can safely be used in any context where a value of type T is expected. from Pierce's "Software Foundations" Of course, you may not want to make `String <: Number` and `Number <: String` (and thus `String = Number`), because there is no sensible way to do so; but this is an issue with the way PHP/JS handles subtyping, not with the notion of subtyping itself and certainly does not apply to the example of nullable types. Unfortunately, I am not familiar enough with C++ to comment on the other question, sorry!
- marcosdumay 2y agoYes, numbers and strings are the same type in Javascript and PHP. And yes, a C++ constructor declares a subtype relation. That's the semantics of those languages.
- meltyness 2y agoYeah I think this is "Deref coercion" in Rust.[0] For example since Vec can Deref to Slice, you can syntactically run Slice methods on a Vec; meaning Vec is a subtype of Slice. [0] https://doc.rust-lang.org/std/ops/trait.Deref.html#deref-coercion https://doc.rust-lang.org/std/ops/trait.Deref.html#deref-coe...
- meltyness 2y agoAs I revisit, this also comes up more explicitly when dealing with lifetimes as a type, and stacked borrows. [0] https://doc.rust-lang.org/nomicon/subtyping.html https://doc.rust-lang.org/nomicon/subtyping.html
- steveklabnik 2y agoLifetimes are the only subtyping relationship in Rust, yes.