mhhhhh, what do you think of this quote ? Not to reject the whole work, 
just an example i stumble upon.

_______________________

Note that type deduction requires types to be identical. This is stronger 
than the usual requirement when calling a function, namely that the types 
are assignable.


func [T] Find(s []T, e T) bool
type E interface{}
var f1 = 0
        // Below does not compile.  The first argument means that T is
        // deduced as E. f1 is type int, not E. f1 is assignable to
        // E, but not identical to it.
var f2 = Find([]E{f1}, f1)
        // Below does compile. Explicit type specification for Find
        // means that type deduction is not performed.
var f3 = Find[E]([]E{f1}, f1)

_______________


Stupid remark, in "Note that type deduction requires types to be 
identical", if the type must be identical, 
there is no mechanism for type deduction that can take place.

>From human point of view,
[]interface is as good as []int to store/receive ...int


On Friday, August 25, 2017 at 1:06:44 PM UTC+2, Henrik Johansson wrote:
>
> Ah yes unfortunate that Ians proposal was rejected.
>
> fre 25 aug. 2017 kl 10:39 skrev 'Axel Wagner' via golang-nuts <
> golan...@googlegroups.com <javascript:>>:
>
>> 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 <egon...@gmail.com <javascript:>> 
>> 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...@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...@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.

Reply via email to