My point was that type-classes don't really help in and off itself. What helps is that operators are methods (i.e. Haskell has operator overloading). If Go had operator methods, that would work too (obviously), because you could write an interface for them.
Anyway :) On Fri, Sep 7, 2018 at 12:21 AM jimmy frasche <soapboxcic...@gmail.com> wrote: > I meant without having to use a wrapper but still accepting all three. > I certainly agree that it not the Go way or the way to go. > On Thu, Sep 6, 2018 at 3:16 PM Axel Wagner > <axel.wagner...@googlemail.com> wrote: > > > > On Thu, Sep 6, 2018 at 11:36 PM jimmy frasche <soapboxcic...@gmail.com> > wrote: > >> > >> To unify those cases you need something like haskell-style typeclasses > >> where you can say this type satisfies this contract using these > >> methods/operators. > > > > > > FWIW, the Go way of doing that is embedding it in a new struct and > overwriting the methods - which is pretty much the only way to do it while > maintaining the property that only the owner of a type can define methods > on it. > > > > So, you can already do this. But it requires you to write it. Which is > boilerplate. > > (which I'm personally fine with, FTR :) ) > > > >> > >> > >> > >> Even ignoring that, the contracts proposal doesn't let you write a > >> generic variadic min/max since there's no way to get the > >> smallest/largest value of a type so you can't write > >> > >> func min(type T ordered)(ts ...T) T { > >> min := LargestPossible(T) // not possible > >> for _, t := range { > >> if t < min { > >> min = t > >> } > >> } > >> return min > >> } > >> > >> You could get around that with the signature (firstOne T, rest ...T) > >> but there's a larger point about the necessity of knowing numeric > >> limits and properties for writing that kind of generic code in there. > >> > >> > >> One way around the asymmetry between operators and methods that > >> doesn't introduce any issues like operator methods or any of that is > >> to have a package that defines types like > >> > >> package basic // not the best name > >> > >> type Int int > >> > >> type Slice(type T) []T > >> > >> // and so on for all the primitive and basic composite types > >> > >> and give all of those methods like Less and At. You'd have to do > >> int(min(basic.Int(x), basic.Int(y))) but at least you wouldn't have to > >> write the trivial wrapper methods. Not especially pretty. > >> > >> -- > >> 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. > -- 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.