On Thu, Jan 6, 2022 at 8:59 AM 'Axel Wagner' via golang-nuts
<golang-nuts@googlegroups.com> wrote:
>
> • From the definition of type elements, we can see that an embedded interface 
> type is a type element. Therefore, `any` is a type element.
> • `any` is an alias for `interface{}`, therefore it is a type without any 
> type elements, therefore the set of its specific types is empty ("For an 
> interface with no type elements, 𝑆 is the empty set.").
> • `interface{ int; any }` is a type with two type elements. "For an interface 
> with type elements, 𝑆 is the intersection of the specific types of its type 
> elements.". Intersecting with an empty set (the specific types of `any`) 
> gives an empty set
> • Therefore, the set of specific types of `interface{ int; any }` is the 
> empty set.

That doesn't seem right.  "any" is an interface type and writing
"interface { any }" just embeds the empty interface, which has no
effect.

I think the spec is incorrect here (and gri already sent
https://golang.org/cl/375799 for this).

But maybe there is something else wrong with the description of specific types.

Ian


> On Thu, Jan 6, 2022 at 5:34 PM Jason Phillips <jasonryanphill...@gmail.com> 
> wrote:
>>
>> And by "first paragraph of the spec" I mean "first paragraph of the 
>> Structure of interfaces section of the spec". Apologies.
>>
>> On Thursday, January 6, 2022 at 11:11:45 AM UTC-5 Jason Phillips wrote:
>>>
>>> @Brian
>>>
>>> > interface{ int; m() } // [specific type] int (but type set is empty 
>>> > because int has no method m)
>>> > interface{ int; any } // no specific types (intersection is empty) [even 
>>> > though the type set is not empty]
>>>
>>> As noted in the first paragraph of the spec, the set of specific types is 
>>> calculated by only considering type elements in the interface. Given that, 
>>> I think the spec note is wrong in the example being discussed. It should be 
>>> "int". Also, regardless of the answer, surely the specific types for 
>>> "interface{ int; m() }" and "interface{ int; any}" are always the same?
>>>
>>> On Thursday, January 6, 2022 at 10:37:55 AM UTC-5 tapi...@gmail.com wrote:
>>>>
>>>> On Thursday, January 6, 2022 at 11:19:40 PM UTC+8 tapi...@gmail.com wrote:
>>>>>
>>>>> On Thursday, January 6, 2022 at 9:40:52 PM UTC+8 tapi...@gmail.com wrote:
>>>>>>
>>>>>> On Thursday, January 6, 2022 at 8:35:06 PM UTC+8 Brian Candler wrote:
>>>>>>>
>>>>>>> No, the mistake is in your reading of the spec.  You are complaining 
>>>>>>> about this line:
>>>>>>>
>>>>>>> interface{ int; any } // no specific types (intersection is empty)
>>>>>>>
>>>>>>> The spec makes it clear that:
>>>>>>> 1. "any" is short for "interface {}"
>>>>>>> 2. "interface {}" has no specific types
>>>>>>>
>>>>>>
>>>>>> I think your logic mistake here is that the operands of the union and 
>>>>>> intersection operations are type sets, instead of specific types.
>>>>>
>>>>>
>>>>> This conclusion is not very precise. More precisely, the operands of the 
>>>>> union and intersection operations
>>>>> could be either type set or specific types, but interface types don't 
>>>>> participate in calculations of specific types.
>>>>
>>>>
>>>> This is still not precise. More precisely speaking, in calculations of 
>>>> specific types,
>>>> interface types don't participate in intersection operations,
>>>> and only "any" (interface{}) is allowed to participate in union operations.
>>>> The result of a union operation with any as an operand is a blank set.
>>>>
>>>>>
>>>>>
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> You are taking the intersection of the set of one type (int) with the 
>>>>>>> empty set, and therefore the result is the empty set.  Exactly as the 
>>>>>>> comment says.
>>>>>>>
>>>>>>> On Thursday, 6 January 2022 at 11:47:52 UTC tapi...@gmail.com wrote:
>>>>>>>>
>>>>>>>> On Thursday, January 6, 2022 at 6:15:06 PM UTC+8 Brian Candler wrote:
>>>>>>>>>
>>>>>>>>> 1. interface { a;b } is intersection. The "Intersection" between two 
>>>>>>>>> sets means things which exist in both sets simultaneously.
>>>>>>>>> 2. interface { a|b } is union.  "Union" means a set of things which 
>>>>>>>>> which exist in set A or set B.
>>>>>>>>>
>>>>>>>>> Quoting from the spec:
>>>>>>>>> "the predeclared type any is an alias for the empty interface."
>>>>>>>>> "interface{} // no specific types"
>>>>>>>>> "For an interface with type elements, 𝑆 is the intersection of the 
>>>>>>>>> specific types of its type elements."
>>>>>>>>>
>>>>>>>>> Can you see now?
>>>>>>>>
>>>>>>>>
>>>>>>>> The explanation is as what I think.
>>>>>>>> But what is your conclusion? Is it a mistake in spec?
>>
>> --
>> 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.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/cda21095-d57e-4f9d-8853-4a6a7e683953n%40googlegroups.com.
>
> --
> 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.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/CAEkBMfGV9tfn%2BZfRKs%3DyX2uybnUfxWswRUHww%2B%2BdUQsvP%2B_4FA%40mail.gmail.com.

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcUR%2BXqb8sOo_nxtuphFeRMFX5KQmJLYxQ%2BuQPRMg1QfRA%40mail.gmail.com.

Reply via email to