Ah yes unfortunate that Ians proposal was rejected.

fre 25 aug. 2017 kl 10:39 skrev 'Axel Wagner' via golang-nuts <
golang-nuts@googlegroups.com>:

> Maybe a loaded question but what is the goal of this thread? Is it to
> establish whether or not generics impact readability? In that case it
> should get a lot more civil and charitable on both sides.
>
> Anyway, my take on that: The examples mentioned, in a very real way, are
> not really suitable to discuss that question. Any readability impact comes
> not so much from simple declarations, but from a) how frequent
> type-parameterized objects are going to be and b) how often we can omit the
> type-parameteres. The issues are things like parameterized type-parameters
> (today this example
> <https://twitter.com/MuseumOfTypes/status/428302745330651136> flew
> through my twitter stream, to illustrate the point) and extra layers of
> abstraction (like using a Map<Iterable<rune>, Numeric> instead of a
> map[string]int).
>
> Basically, we have three opposing forces: 1) How powerful the generics
> implementation is, that is what are the things that can be parameterized,
> 2) How powerful type-inference is for them, that is in which specific
> circumstances types can be omitted (this is the vital "readability" part)
> and 3) How simple the description of them is, that is how easy is it to
> understand failed type-checks to the programmer and how much space would
> they take up in the spec and/or implementation.
>
> Currently, Go *mostly* has 1 near zero (it is a little positive due to the
> existence of map, [], chan… and append/copy/…), in preference of 2 and 3.
> Most people agree, that 1 should get a little more love though. It's easy
> to come up with syntax or semantics that make 1 large, but the issue is,
> that while we want to increase 1, we don't just want to neglect 2 and 3.
>
> Most languages with powerful generics will also include a lot of machinery
> for 2, that is a complicated type-inference mechanism. Because it's so
> complicated, they will mostly omit 3, that is they will not specify how
> exactly it works and leave that up to the implementation, giving them the
> flexibility to tune the intelligence over time. Most of them (*cough* C++
> <https://codegolf.stackexchange.com/questions/1956/generate-the-longest-error-message-in-c>
> *cough*) also completely fail to provide meaningful error messages for even
> reasonably simple failures.
>
> Now, it's easy to just write down *some* generic (or not generic) code to
> illustrate some level of readability. But to actually see the effects, a
> lot more and realistic code is needed and we *need* to talk about 2 and 3.
> An incredibly good example for how to discuss these is Ian's Proposal for
> type parameters
> <https://github.com/golang/proposal/blob/master/design/15292/2013-12-type-params.md>.
> It gives a detailed description of the power, the type-inference mechanism
> and the complexity of implementation. AIUI, it failed because of 3.
>
> Not every message or opinion about this, of course, needs this level of
> detail. But just ignoring the complexity is oversimplifying and doesn't do
> your position a lot of favor.
> A better way to talk about readability would be, to take a real piece of
> code that you'd like to write generically (or predict that people would
> write), take one or two of the existing (declined) proposals and write your
> code down assuming it where implemented. The advantage is, that the
> proposals usually are detailed enough to meaningfully talk about the
> tradeoffs involved and to be sure that "the compiler can infer that" isn't
> just hand-waved.
>
> But Hot-Takes don't really help anyone.
>
> On Fri, Aug 25, 2017 at 10:11 AM, Egon <egonel...@gmail.com> wrote:
>
>> package tree
>>
>> type Node<$Entry> struct {
>> Value $Entry
>> Left  *Node<$Entry>
>> Right *Node<$Entry>
>> }
>>
>> func (node *Node) Insert(value node.$Entry) {
>> var side **Node<node.$Entry>
>> if node.Value.Less(value) {
>> side = &node.Right
>> } else {
>> side = &node.Left
>> }
>>
>> if *side == nil {
>> *side = &Node<node.$Entry>{Value: value}
>> } else {
>> (*side).Insert(value)
>> }
>> }
>>
>> --
>>
>> package tree<Entry>
>>
>> type Entry generic {
>> Less(Entry) bool
>> }
>>
>> type Node struct {
>> Value Entry
>> Left  *Node
>> Right *Node
>> }
>>
>> func (node *Node) Insert(value Entry) {
>> var side *Node
>> if node.Value.Less(value) {
>> side = &node.Right
>> } else {
>> side = &node.Left
>> }
>>
>> if *side == nil {
>> *side = &Node{Value: value}
>> } else {
>> (*side).Insert(value)
>> }
>> }
>>
>>
>> On Thursday, 24 August 2017 20:08:16 UTC+3, mhh...@gmail.com wrote:
>>>
>>> Why would you put generics on a method ?
>>>
>>> The syntax you demonstrate is horrible, indeed.
>>>
>>> what if generics are type related
>>>
>>> type notFinal struct {
>>>    p1 <T1>
>>>    p2 <T2>
>>> }
>>>
>>> func (n notFinal) whatever(in <T1>) string {
>>>    return fmt.Sprintf(in) // anything to interface{}, works.
>>> }
>>>
>>> type Final notFinal<int, string>
>>>
>>> Final.whatever(1) // "1"
>>>
>>> //notFinal not instantiable, not type assertable
>>>
>>>
>>>
>>> Or func related
>>>
>>> type notFinal func(in <T1>) string
>>>
>>> func Final notFinal<int>
>>>
>>> Final(1) // "1"
>>>
>>>
>>> That said, ultimately, the more the syntax is parametrized the more
>>> complex it become. when there are many func signature as you demonstrate,
>>> it will get worse.
>>>
>>> Named type might help, could be vetted too ?
>>>
>>> Also
>>> none of this is as powerful as code gen.
>>> None of those examples are better than interface{}.
>>>
>>> On Thursday, August 24, 2017 at 5:14:58 PM UTC+2, JuciÊ Andrade wrote:
>>>>
>>>> A lot of people like Go because code is very readable even for
>>>> beginners.
>>>>
>>>> func f(x, y int)
>>>>
>>>> f is a function that receives x and y as int parameters, returning
>>>> nothing. Simple enough.
>>>>
>>>> func f(x, y int) int
>>>>
>>>> f is a function that receives x and y as int parameters, returning yet
>>>> another int. Fine.
>>>>
>>>> func f(x, y int) (z int, err error)
>>>>
>>>> f is a function that receives x and y as int parameters, returning two
>>>> values: a first int, that we name z and an error named err. A little bit
>>>> weird, but ok.
>>>>
>>>> func (r MyType) f(x, y int) (z int, err error)
>>>>
>>>> f is a method for a value of type MyType, henceforth named r, that
>>>> receives x and y as int parameters, returning two values: a first int, that
>>>> we name z and an error named err. Definitely not so simple.
>>>>
>>>> <genType1, genType2> func (r genType1) f(x, y genType2) (z getType2,
>>>> err error)
>>>>
>>>> You must be kidding. STOP RIGHT THERE!
>>>>
>>>> --
>> 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.
>

-- 
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.

Reply via email to