Hi Ian, thanks for having a look. I'll open a bug report.

On Wednesday, February 16, 2022 at 9:46:09 PM UTC+1 Ian Lance Taylor wrote:

> On Tue, Feb 15, 2022 at 2:49 PM Blackgreen <bg.the...@gmail.com> wrote:
> >
> > I came across this stack overflow question:
> > 
> https://stackoverflow.com/questions/71131665/generics-pass-map-with-derived-types
> >
> > The OP attempted to pass different maps into this code:
> >
> > func equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool { if 
> len(m1) != len(m2) { return false } for k, v1 := range m1 { if v2, ok := 
> m2[k]; !ok || v1 != v2 { return false } } return true }
> >
> > It is clear to me why this doesn't work. However, I was studying 
> possible fixes for this function. Here's a playground: 
> https://gotipplay.golang.org/p/NPpau1G0Hqp
> >
> > My first attempt was based on differentiating the K and V type params 
> and came up with this:
> >
> > func equal[M1 ~map[K1]V1, M2 ~map[K2]V2, K1, K2 ~uint32, V1, V2 
> ~string](m1 M1, m2 M2) bool {
> > if len(m1) != len(m2) {
> > return false
> > }
> > for k, v1 := range m1 {
> > if v2, ok := m2[K2(k)]; !ok || V2(v1) != v2 {
> > return false
> > }
> > }
> > return true
> > }
> >
> > I thought this should work, because now it's possible to infer K1 and K2 
> from M1 and M2 respectively, and the approximate constraints allow 
> conversion in the function body. But it still doesn't compile with error 
> "K2 does not match uint32".
> >
> > Instead, this works, even though K1 and K2 are defined the same way:
> >
> > func equalFixed[K1, K2 ~uint32, V1, V2 ~string](m1 map[K1]V1, m2 
> map[K2]V2) bool {
> > }
> >
> > By reading the Go 1.18 language specs, my intuition is that the first 
> attempt fails due to the so-called "adjusted core type" of the constraint 
> ~uint32, though I'm not 100% sure of what's going on.
> > Can you folks confirm my intuition and/or provide some pointers?
>
>
> This looks like a bug in type inference to me. I may be missing
> something but I don't see how it could be producing that error. Would
> you mind opening a bug report at https://go.dev/issue? Thanks. Note
> that this may not be fixed in the upcoming 1.18 release, as we are
> trying to be careful about type inference.
>
> Ian
>

-- 
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 golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/ed5cdd4f-1e1f-4a1f-9ffb-d6dbf73940e6n%40googlegroups.com.

Reply via email to