As someone who has spent a LOT of time in Rust, I really miss generics in 
Go (Conversely, i miss the simplicity of Go. My personal favorite, 
imaginary language would probably be  Go + Generics + Sum Types and 
destructuring) and so I am really excited to see this taking shape. 

That being said, here are some things that I personally think are less than 
ideal (first world problems eh?):

1) Of the enumerated omissions, the ones that I think are really 
unfortunate are, in order of importance, from my perspective: 

   - No operator methods & no adapters - Doesn't this make generic types 
   sort of second class?. I think these features would be an elegant addition 
   to the language but I assume that there is a reason for their omission. 
   - No support covariance or contravariance. Maybe I am on shaky ground in 
   terms of my understanding but doesn't this mean, for instance, that if I 
   have two interfaces, Foo and Bar, and a third composite interface, FooBar, 
   which consists of Foo and Bar, that a function with a generic parameter T 
   constrained by Foo would not accept a type that implements FooBar? If i am 
   incorrect, where does this come into play?
   - No support for variadic type parameters. Rust gets around this with 
   hygienic macros and meta-programming. I am not a big fan of the level of 
   complexity/quirkiness involved with working around the lack of variadics in 
   Rust. I hope to see them in Generics in Go one day. Otherwise, you will 
   probably end up api bloat full of functions differing only in the number of 
   parameters supported.

2) I don't see syntax for directly applying multiple constraints to a 
generic type. Is this achievable only via interface composition? 
3) And something I glossed over during the first reading, but is a bit sad 
- Methods may not take additional type arguments. 

Also, in the area of ergonomics, here are some thoughts:
1) Allow for separating out generic type declarations from constraints. 
Rust allows you to split type parameter declaration from type constraints 
via an optional `where` keyword which comes right before the body of the 
entity. This is very helpful for readability, especially given complex 
constraints.
2) I personally don't think allowing multiple types to share a constraint 
is worth not allowing unbounded types without the bulky "interface{}" type. 
Is there some other simpler syntax that could be considered? Would a simple 
{} be a parsing nightmare? What about '_' ?  Something like `func Something 
(type T _, U SuperUseful ) (a T, b U){...}` ?
On Monday, August 10, 2020 at 9:46:44 AM UTC-7 3cl...@gmail.com wrote:

> I am trying to add my 2 cents here.
>
>
> I am sorry if my opinions have been mentioned.
>
> I personally prefer Round Brackets (parentheses). It is not about 
> readability on symbols, but the way how I understand the logic of Type 
> Parameters.
>
>
>
> I see Type Parameters as a way to describe how to "instantiated" a 
> Declaration (Func/Struct) for being used.
>
> Considering the case of https://go2goplay.golang.org/p/JjA67w8ZvFu , the 
> func `min` is asking for a `type` argument to be specified so it can work 
> properly. Which means it is valid to code line L19 `m := min(int)` to 
> initialize the func `min` with type `int`. 
>
> If we try to read a Type Parameterized func declared in this way, it means 
> the func `min` will first take a `type` argument to initialize it. then the 
> second Round Brackets `(...)` put the arguments to call the func. 
>
> However with Square Bracket, L19 of the case will not work, cause `m := 
> min[int]` would mean taking an element from `min` on index `int`. (sure, 
> min here is a Type Parameterized Func, not a slice)
>
>
>
> On the other hand, we can take an analogy of how Functional Programming 
> (FP) works with funcs with multi parameters. (correct me if I am wrong). 
>
> In FP, when a function take two arguments, say `f(a int, b string)`, it's 
> actually interpreted as "A function called `f`, it will first take an 
> argument `a` with type `int`, and return a function f2 which keep a copy of 
> `a` and takes an argument `b` with type `string`". 
>
> An example in Go is following:
>
> ```go
> func concat(a int, b string) string {}
> ```
>
> is equal to
>
> ```go
> func concat(a int) (func( b string) string){
>     return func(b string) {
>         a := a
>         // DO THE ACTUAL WORK
>         return
>     }
> }
> ````
> and when calling `concat()` with `concat(1, "2")`, is actually 
> `concat(1)(2)` or `tmp := concat(1); result := tmp(2)`
>
>
> Taking this analogy back to the original Type Parameters proposal. We can 
> think of a Type Parameterized func has to be called with a `type` being 
> specified. The Type Parameterized func will return a typed version of it. 
> Then we call it with the actual argument(s). 
>
> With Square Brackets, it cannot be interpreted in this way IMO as the 
> syntax is inconsistence. It only make it easier to read for declaring a 
> Type Parameterized func, but not easier to make an instance of the func 
> with type.
>
>
> On Saturday, August 8, 2020 at 12:02:51 PM UTC+2 Denis Cheremisov wrote:
>
>> > Have the authors considered the implications of requiring the `type` 
>> keyword to use a generic type, not just at declaration time? Would this 
>> open up more syntax possibilities, such as `var x T<type int>`? This might 
>> be easier to read at the expense of five more characters of typing. It also 
>> could unify declaration and usage syntax even more than the proposal.
>>
>> > This might be easier to read
>>
>> Square brackets are easier to read. They are larger and catchier to eyes 
>> than lesser and greater signs used as brackets. And type-less syntax with 
>> mandatory constraint is even easier and feels like a great match with the 
>> rest of the language.
>>
>>
>> четверг, 6 августа 2020 г. в 22:25:19 UTC+3, Red Daly: 
>>
>>> Have the authors considered the implications of requiring the `type` 
>>> keyword to use a generic type, not just at declaration time? Would this 
>>> open up more syntax possibilities, such as `var x T<type int>`? This might 
>>> be easier to read at the expense of five more characters of typing. It also 
>>> could unify declaration and usage syntax even more than the proposal.
>>>
>>> (Personally, I will accept any syntax. It's not realistic to expect this 
>>> for go2, but I would prefer if go3 ditched the C-style syntax altogether in 
>>> favor of a simpler, lisp-style syntax. Such a syntax would make it easier 
>>> to introduce language features like this one. Macros and metaprogramming 
>>> would also be much more straightforward for users to add useful 
>>> abstractions to the language.)
>>> On Thursday, August 6, 2020 at 7:15:08 AM UTC-7 Mike Schinkel wrote:
>>>
>>>> Hi Russ,
>>>>
>>>> In general, I think the proposal is a really good one.  I like that you 
>>>> abandoned contracts as interfaces were just too similar, and personally I 
>>>> like the choice of square brackets.
>>>>
>>>> There are a few aspects I do not like — 1.) no zero value and 2.) lack 
>>>> of covariance and contravariance — but perhaps those can be addressed in 
>>>> the future?
>>>>
>>>> All in all, I think the team has come up with a really good approach to 
>>>> generics, much better than the prior proposals.
>>>>
>>>> -Mike
>>>>
>>>> P.S. If there is one thing that piqued my interest about this thread it 
>>>> was Geoff Speicher's suggestion of a "generic" keyword, assuming type 
>>>> inference could be addressed. That approach would be even easier to reason 
>>>> about than the current proposal, I think.  That said, the current proposal 
>>>> is very good if type inference can not be addressed in Geoff Speicher's 
>>>> suggestion.
>>>>
>>>> On Wednesday, July 22, 2020 at 8:02:55 PM UTC-4 Russ Cox wrote:
>>>>
>>>>> So it sounds like everyone is in favor of the entire generics proposal 
>>>>> and all the semantics, and all we have left to hammer out is the bracket 
>>>>> characters? Do I have that right?
>>>>>
>>>>> Best,
>>>>> Russ
>>>>>
>>>>>
>>>>>
>>>>>

-- 
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/0c922d7b-8469-43b1-9234-da0fd63e0ee6n%40googlegroups.com.

Reply via email to