Robert, I suspect that you could achieve 90% coverage with just 4 built-in contracts:
1. integer (any integer type) 2. real (any integer or floating point type) 3. ordered (any integer, floating point or string type) 4. comparable (any type which supports == and !=) If you had just one type parameter, a built-in contract could be applied directly to it where appropriate. For example: func FormatUnsigned(type T real)(v T) string { return strconv.FormatUint(uint64(v), 10) } Otherwise, you'd need to create a user defined contract whose constituents could be restricted to the following: 1. Other embedded contracts (including the built-ins) 2. Interface conversions. This would still allow you to do some quite complicated things. For example: contract Graph(n Node, e Edge) { interface { Edges() []Edge }(n) interface() { Nodes() (Node, Node) }(e) } func ShortestPath(type N, E Graph)(src, dst N) []E { ... } However, you wouldn't be able to specify that structs contain specific named fields, that a type parameter must either be a string or a byte slice and many other things. >From my own perspective I think I'd be happy with a relatively simple constraint system such as this but, as I said earlier, I don't think it'll be enough for the Go team who (within reason) are looking for something more comprehensive. Alan On Tuesday, September 11, 2018 at 5:27:38 PM UTC+1, Robert Engels wrote: > > As I’ve said elsewhere, a SIMPLE to use and understand solution that > covers 90% is better than a complex one to cover 100% IMO, and fits in well > with the rest of Go design. Go leaves out a lot - intentionally - and it’s > a good choice. > > On Sep 11, 2018, at 11:22 AM, alan...@gmail.com <javascript:> wrote: > > There is one thing which I think is quite clear from all the discussions > that have taken place on this topic. > > Having withstood years of criticism for the lack of generics in Go, the > team are not going to be satisfied now with some under-powered or > half-baked solution. They want to have as much power as possible within a > coherent and (hopefully) easy to understand design. > > Now, it says in the draft design paper, that they considered using > interfaces but couldn't find a clear way to represent operators using > interface methods. Having tried to do that myself, I have a lot of sympathy > with that position! > > So instead they came up with the idea of the type parameter(s) having to > satisfy a number of requirements which could be expressed in 'normal' code > and embodied in a new construct called a 'contract'. This idea is somewhat > similar to 'concepts' in C++ as Ian has already pointed out. > > The problem is that many of us don't find the sort of code used in > contracts (as currently envisaged) to be 'normal' at all and we're worried > that the Go community at large will find them difficult to write (though a > tool may help), understand or use. What you've just said, Jeff,enforces > that view. > > So we've put forward some alternative proposals under the feedback system > to try and address the perceived shortcomings of the present system, though > it's not easy. > > I do however have faith that the Go team will eventually come up with > something that will be reasonably powerful, understandable and consistent > with the 'soul' of the language. Let's hope my faith is not misplaced. > > > > -- > 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...@googlegroups.com <javascript:>. > For more options, visit https://groups.google.com/d/optout. > > -- 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. For more options, visit https://groups.google.com/d/optout.