...I have not been able to find it meaningful elsewhere. 

sorry, i forgot, 

- ultimately, type D struct {r<t:Interface>}, does not make sense either 
imo.

On Thursday, July 20, 2017 at 6:21:21 AM UTC+2, mhh...@gmail.com wrote:
>
> I think your example is not relevant, as it clearly intend to change the 
> input type,
> the goal is to preserve it, while still working with its value.
>
>
> interface{} value type destroys the input type information,
> so you might have the opposite value type, 
> a type that preserves.
> A type that let you write, *func, please, return the type i got*.
>
> I did not mention templating, code generate / whatever/  like in 
> https://en.wikipedia.org/wiki/Generic_programming
>
> I read something related in "*Generic programming* is a style of computer 
> programming <https://en.wikipedia.org/wiki/Computer_programming> in which 
> algorithms <https://en.wikipedia.org/wiki/Algorithm> are written in terms 
> of types <https://en.wikipedia.org/wiki/Data_type> *to-be-specified-later* 
> that are then *instantiated* when needed for specific types provided as 
> parameters 
> <https://en.wikipedia.org/wiki/Parameter_%28computer_programming%29>." 
>
> ...*to-be-specified-later... *runtime leaks in the static type system, 
> mostly a question of pov.
>
> - <t> behaves like interface{} value type, because it does still say 
> absolutely nothing. Not because it lacks of identity, but because it 
> represents too many possible type.
> - <t:Interface> is a shorthand to avoid a, probably, very repetitive type 
> assert in order to use a <t>, much like an interface{}, but better, because 
> its shorter
> - <t> can be use only in func/method parameter (*excluded *receiver) ? I 
> have not been able to find it meaningful elsewhere. 
> - if you don t need to return the input type, you don t need <t>
> - ultimately, []interface{} == []<t>, they both are list of stuff we have 
> no idea what its about, but <t> has no sense if it is not scoped to a 
> function call stack.
> - ultimately, []<t:Stringer> does not make sense.
>
> - when you receive a func (x <t>) <t> {}, it does actually says nothing to 
> you, the declarer of the func, not because it lacks of identity, but 
> because it represents too many possible types. If you d want to do 
> something of it, you need to type assert it, to narrow it to something 
> meaningful.
> - when you receive a constrained <t:Interface>, you can work on value of 
> type Interface, and you can return whatever, including the input parameter 
> type
> - when you call a func with a constrained type, you can actually 
> statically verify that the input value satisfies the constraint.
> - when you call a <t>, anything is as good as nil (i guess)
>
>
>
> On Wednesday, July 19, 2017 at 11:47:40 PM UTC+2, Eric Johnson wrote:
>>
>> While I lean towards the view that Go should add support for type 
>> generics, I'm not sure your example actually provides sufficient detail to 
>> be an argument for them.
>>
>> On Monday, July 17, 2017 at 2:07:46 AM UTC-7, mhh...@gmail.com wrote:
>>>
>>> in func do(i interface{}) interface{} (return i), do says nothing 
>>> because "interface{} says nothing", 
>>>
>>> from the caller pov, it looses information at the return call, 
>>>
>>> var x = "o"
>>> do(x) // <- return lost the track it was a string
>>>
>>> if you delegate that func to another func, 
>>> it can t says anything else rather than nothing unless it introduces 
>>> type assertion.
>>> func to(do func(interface{})interface{}) func (interface{}) interface{} 
>>> { return func (i interface{}) interface{} {return do(i)} }
>>>
>>> if the observation become "interface{} destroys information", 
>>> does it make sense to consider a "value type of any type that carries 
>>> out its input type" ?
>>> func do(any <t>) <t> {return any}
>>> do("thing") <- this is explicitly string
>>>
>>> Acting the same way as interface, except that little thing about 
>>> destroying/preserving an information.
>>>
>>> It can be delegated to func that works on anything, still returns 
>>> concrete types.
>>> func to(do func(*<t>*)<t>) func (<t>) *<t>* { return func (i <t>) <t> 
>>> {return do(i)} }
>>>
>>> to(do)("whatever") // got a string, right ?
>>>
>>> One step forward, 
>>> what if <t> might be able to say "any type with a constraint on that 
>>> interface",
>>> func do(any <t:Stringer>) <t> {return any}
>>> do(WhateverStringerCapable{}) <- much like using a regular parameter of 
>>> type Stringer/interface{}, but now the return call reflects the invoke call 
>>> , so its more complete than interface{}/Stringer.
>>>
>>
>> If the "do" method takes and returns a Stringer, then why not just 
>> declare it that way? To make this a more interesting discussion, you have 
>> to get into the details of what the "do" function actually needs to do? Why 
>> can't it just use standard interfaces?
>>
>> As I see it, one of the generics problems comes from using the built-in 
>> slices and maps. As it current stands, if I create a method:
>>
>> func concat(foo []Stringer) String {
>>     result = ""
>>     for _, s := range foo {
>>         result = result + s.String() + ";
>>     }
>>     return result
>> }
>>
>> but suppose I have two structs, Foo, and Bar, and both *Foo, and *Bar 
>> implement Stringer.
>>
>> I cannot do this:
>> func myFunc(f []*Foo, b []*Bar) string {
>>     return concat(f) + concat(b)
>> }
>>
>> This seems like a more concrete scenario than the one you identified.
>>
>> Eric.
>>  
>>
>>>
>>> no?
>>>
>>> Or maybe there is a reason in destroying that information ?
>>>
>>

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