I have the similar thought as the thread. In terms of a contract, it is 
mainly to express these:

   1. Methods set: this could be easily expressed by interface
   2. Operators set: In go, we could not add or remove the existing 
   operator set for a given type, which is completely inherited from its 
   underlying type. So it is equivalent to explicitly express operation set vs 
   to express the union of underlying types.
   3. Type conversion:
      1. conversion between types with the same underlying type
      2. conversion between numeric types
      3. conversion from concrete types to interface
   
So it is obviously that what we are lacking is: expressing underlying types 
and expressing the combination of them, i.e. union type. So maybe a 
contract could be written like this:

contract Foo(T) {
  int(T) || float64(T) || complex128(T)  // underlying type: int, float64, 
complex128
  InterfaceA(T)                                    // at the same time, it 
should satisfy InterfaceA
}

contract Slice(S) {
  []T(S) && Foo(T)    // S is a slice, and retrieve the element type to T, 
and T should match contract Foo
}

contract Map(M) {
  (map[K]V)(M) && Foo(V)  // M is a map, whose value type match contract 
Foo.
}

There is still no way to express that a type should have a field "f" - But 
maybe we can accept this?

In this case, contract is more orthogonal to the existing concepts in go - 
we already have the way to express the method set of a type (interface), it 
is no needed to be able to express it in contract again. 


On Monday, September 17, 2018 at 4:54:04 PM UTC-7, alanfo wrote:

> Thanks for your comment, Patrick.
>
> Although I've relied on compiler magic for my previous proposals, I 
> believe we should keep it to a minimum if we can, The 'union' and 'except' 
> idea would allow us to compose any group of types we want from the basic 
> built-ins and, even within the standard library, it would always be clear 
> from looking at the underlying code exactly what those groups comprised. 
>
> For me that would be a valuable feature and would still be significantly 
> less complex than the draft generics design where every operator used has 
> to be spelled out. Under this proposal, the allowable operators/conversions 
> etc. are implicit from the types used.
>
> Alan
>
> On Monday, September 17, 2018 at 8:16:38 PM UTC+1, Patrick Smith wrote:
>>
>> I think your idea of creating standard contracts to represent similar 
>> types is a good one. However, you don't have to say how those contracts are 
>> written, just what they do. No need for typecheck, union, except, etc. For 
>> example,
>>
>> Integer(T) - T is an integer type
>> Float(T) - T is a floating point type
>> Complex(T) - T is a complex type
>>
>> For contracts in the standard library, we can just invoke "compiler 
>> magic" to explain how they work. Trying to explain the mechanism merely 
>> adds complexity.
>>
>

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