On Fri, Aug 21, 2020 at 11:30 PM roger peppe <rogpe...@gmail.com> wrote:

> On Fri, 21 Aug 2020 at 22:10, jimmy frasche <soapboxcic...@gmail.com>
> wrote:
>
>> I'd assume that would fail to compile as you're returning a []T not a
>> []int
>>
>
> If that's the case, then I'm not sure that such a type switch would be
> very useful. It would tell you what type the values are, but you can't do
> anything with them because all the values would still be of the original
> type.
>

You can reasonably convert them to their underlying type and *then* use
them as such.
That would make it useful while not allowing what you posit.

I had assumed that the intention was that within the arm of the type
> switch, the switched type would take on the specified type.
> That would allow (for example) specialising to use underlying machine
> operations on []T when T is a known type such as byte.
>

It would, however, prevent you from calling methods on the type or pass it
to a function taking an interface compatible with the constraint.
Also, I shudder to even imagine how this could be put into a spec.


>
>
> On Fri, Aug 21, 2020 at 2:07 PM roger peppe <rogpe...@gmail.com> wrote:
>> >
>> >
>> > On Fri, 21 Aug 2020 at 01:28, Ian Lance Taylor <i...@golang.org> wrote:
>> >>
>> >> After many discussions and reading many comments, we plan to move
>> >> forward with some changes and clarifications to the generics design
>> >> draft.
>> >>
>> >> 1.
>> >>
>> >> We’re going to settle on square brackets for the generics syntax.
>> >> We’re going to drop the “type” keyword before type parameters, as
>> >> using square brackets is sufficient to distinguish the type parameter
>> >> list from the ordinary parameter list.  To avoid the ambiguity with
>> >> array declarations, we will require that all type parameters provide a
>> >> constraint.  This has the advantage of giving type parameter lists the
>> >> exact same syntax as ordinary parameter lists (other than using square
>> >> brackets).  To simplify the common case of a type parameter that has
>> >> no constraints, we will introduce a new predeclared identifier “any”
>> >> as an alias for “interface{}”.
>> >>
>> >> The result is declarations that look like this:
>> >>
>> >> type Vector[T any] []T
>> >> func Print[T any](s []T) { … }
>> >> func Index[T comparable](s []T, e T) { … }
>> >>
>> >> We feel that the cost of the new predeclared identifier “any” is
>> >> outweighed by the simplification achieved by making all parameter
>> >> lists syntactically the same: as each regular parameter always has a
>> >> type, each type parameter always has a constraint (its meta-type).
>> >>
>> >> Changing “[type T]” to “[T any]” seems about equally readable and
>> >> saves one character.  We’ll be able to streamline a lot of existing
>> >> code in the standard library and elsewhere by replacing “interface{}”
>> >> with “any”.
>> >>
>> >> 2.
>> >>
>> >> We’re going to simplify the rule for type list satisfaction.  The type
>> >> argument will satisfy the constraint if the type argument is identical
>> >> to any type in the type list, or if the underlying type of the type
>> >> argument is identical to any type in the type list.  What we are
>> >> removing here is any use of the underlying types of the types in the
>> >> type list.  This tweaked rule means that the type list can decide
>> >> whether to accept an exact defined type, other than a predeclared
>> >> type, or whether to accept any type with a matching underlying type.
>> >>
>> >> This is a subtle change that we don’t expect to affect any existing
>> >> experimental code.
>> >>
>> >> We think that this definition might work if we permit interface types
>> >> with type lists to be used outside of type constraints.  Such
>> >> interfaces would effectively act like sum types. That is not part of
>> >> this design draft, but it’s an obvious thing to consider for the
>> >> future.
>> >>
>> >> Note that a type list can mention type parameters (that is, other type
>> >> parameters in the same type parameter list).  These will be checked by
>> >> first replacing the type parameter(s) with the corresponding type
>> >> argument(s), and then using the rule described above.
>> >>
>> >> 3.
>> >>
>> >> We’re going to clarify that when considering the operations permitted
>> >> for a value whose type is a type parameter, we will ignore the methods
>> >> of any types in the type list.  The general rule is that the generic
>> >> function can use any operation permitted by every type in the type
>> >> list.  However, this will only apply to operators and predeclared
>> >> functions (such as "len" and "cap").  It won’t apply to methods, for
>> >> the case where the type list includes a list of types that all define
>> >> some method.  Any methods must be listed separately in the interface
>> >> type, not inherited from the type list.
>> >>
>> >> This rule seems generally clear, and avoids some complex reasoning
>> >> involving type lists that include structs with embedded type
>> >> parameters.
>> >>
>> >> 4.
>> >>
>> >> We’re going to permit type switches on type parameters that have type
>> >> lists, without the “.(type)” syntax.  The “(.type)” syntax exists to
>> >> clarify code like “switch v := x.(type)”.  A type switch on a type
>> >> parameter won’t be able to use the “:=” syntax anyhow, so there is no
>> >> reason to require “.(type)”.  In a type switch on a type parameter
>> >> with a type list, every case listed must be a type that appears in the
>> >> type list (“default” is also permitted, of course).  A case will be
>> >> chosen if it is the type matched by the type argument, although as
>> >> discussed above it may not be the exact type argument: it may be the
>> >> underlying type of the type argument.
>> >
>> >
>> > Here's one interesting implication of this: it allows us to do type
>> conversions that were not previously possible.
>> >
>> > For example, if we have "type I int", we can use a type switch to
>> convert some type []I to type []int:
>> > https://go2goplay.golang.org/p/-860Zlz7-cn
>> >
>> > func F[type T intlike](ts []T) []int {
>> >     switch T {
>> >     case int:
>> >         return ts
>> >     }
>> >     return nil
>> > }
>> >
>> > It seems to me that this kind of thing will allow us to perform a
>> similar conversion (convert some part of the type to its underlying type)
>> on any type.
>> >
>> > In the early days of Go, the spec allowed this kind of conversion as a
>> normal type conversion. I wonder if it might be reasonable to revert to
>> those more relaxed semantics. I think they're potentially useful, for
>> example, when dealing with named types obtained from modules with two
>> different major versions without incurring copies.
>> >
>> > Although in the above-linked issue Robert talks about runtime costs
>> such as "possibly re-mapping method tables", I don't see that this would
>> necessarily be the case. Thoughts?
>> >
>> > --
>> > 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/CAJhgacjL7p7qck%3DSO0Nz9f%2BKZw6MNcgkD5REXwSNK7_fCTXYQg%40mail.gmail.com
>> .
>>
> --
> 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/CAJhgacjTm%3DC-6f%2B4%2BA0HCTDT0_U7pQZOmRjShuzigdocDzAcww%40mail.gmail.com
> <https://groups.google.com/d/msgid/golang-nuts/CAJhgacjTm%3DC-6f%2B4%2BA0HCTDT0_U7pQZOmRjShuzigdocDzAcww%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
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/CAEkBMfFY5Xko--%2B1zfNCjZZqRpw1dFsHVTVnpXs4wJq4GsacMA%40mail.gmail.com.

Reply via email to