On Friday, January 5, 2024 at 12:59:25 AM UTC-5 Axel Wagner wrote:
3. Someone comes up with a clever new compromise.
Here is a strawman proposal: Allow `Nullable`:
type Nullable[T any] struct {
T
valid bool
}
By generating a compile error when a developer attempts to use a type as a
parameter that would create ambiguity, e.g. throw a compile error on these
lines from your examples:
var y X[*strings.Reader]
And:
F[*strings.Reader]()
I do recognize that deep call stacks may cause difficulty for this
proposal, but my logical reasoning about them (vs. me knowing how it would
to be implemented) tells me that `main()` should be able to see the generic
type that `F()` requires because `F()` should be able to see the generic
type that `G()` requires which is type `X`, and type `X` implements a
`Read()` thus making it ambiguous with `*strings.Reader`:
type X[T any] struct {
T
*bufio.Reader
}
func F[T any]() {
G[T]()
}
func G[T any]() {
var x X[T]
x.Read
}
Unless it is effectively not possible to implement that type of logic in
the Go compiler because of design decisions — possibly related to
compilation performance — then it seems logical the Go compiler should be
able to recognize the conflict and generate a compile error on such
combinations at the point of passing the type parameter, explicitly or
implicitly.
While not a perfect solution — since it would disallow edge cases where a
developer feels they really must create a struct with both type parameters
and use with types that create ambiguity — such a compromise would stop
perfect from being the enemy of the good.
Anyway, as stated this is a strawman proposal. Please shoot holes in it if
there are any opportunities to do so.
-Mike
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/eaf71dec-e078-48bd-907c-ed7ff1ada222n%40googlegroups.com.