The current proposal says 
<https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-type-parameters.md#using-types-that-refer-to-themselves-in-constraints>


*The rule is that if a type contraint has a single type parameter, and it 
is used in a function's type parameter list without an explicit type 
argument, then the type argument is the type parameter being constrained.*

That means you can write

    type Comparer[T any] interface {
        Compare(T) int
    }

    func Min[T Comparer](x, y T) bool {
        if x.Compare(y) < 0 {
            return x
        }
        return y
    }

Applying the same rule to type lists and type switches you should be able 
to write

    type Comparer[T any] interface {
        Compare(T) int
    }

    type CompareConstraints interface {
        type int, int8, …, float64, string, Comparer
    }

    func Min[T CompareConstraints](x, y T) bool {
        switch T {
        case int:
            …
        …
        case Comparer:
            if x.Compare(y) < 0 {
                return x
            }
            return y
        }
    }

But the current proposal does not allow interfaces in type lists.
On Monday, 24 August 2020 at 07:09:15 UTC+1 rog wrote:

> On Mon, 24 Aug 2020 at 06:35, Denis Cheremisov <denis.ch...@gmail.com> 
> wrote:
>
>> I probably didn't read what you have wrote in the first message carefuly 
>> enough. Does it mean something like that will work
>>
>>     type SomeTypes interface {
>>     type int, float32, float64
>>     }
>>
>>     func Min[T SomeTypes](x, y T) T {
>>         switch T {
>>         case int:
>>             if x < y {
>>                 return x
>>             }
>>             return y
>>         case float32:
>>             return math.Min(float64(x), float64(y))
>>         case float64:
>>             return math.Min(x, y)
>>         }
>>     }
>>
>  
> This was discussed above.
>
> I don't believe you can do that. I didn't see any suggestion that knowing 
> the type implies the ability
> to convert from the generic type to the known underlying type.
>
>>
>> Would something like below work as well?
>>
>>     type Compare[T any] interface {
>>         Compare(x, y T) int
>>     }
>>
>>     type CompareConstraints[T any] {
>>         type int, int8, …, float64, string, Compare[T]
>>     }
>>
>>     func Min[T CompareConstraints]Min(x, y T) bool {
>>         switch T {
>>         case int:
>>             …
>>         …
>>         case Compare[T]:
>>             return x.Compare(y) < 0
>>         }
>>     }
>>
>
> No. As proposed, the type switch doesn't change anything about the type T.
>
> Also, AIUI that type list wouldn't be very useful in practice, because 
> using that interface type in the type list would only allow types whose 
> underlying type is exactly Compare[T], which doesn't include any 
> non-interface types or interface types that have more methods than just 
> Compare.
>
>   cheers,
>     rog.
>
>

-- 
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/03342d1f-5c82-40e6-98fc-18e95bfd183cn%40googlegroups.com.

Reply via email to