> On May 13, 2016, at 10:33 AM, Adrian Zubarev via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
>> 
>> But maybe we should consider generalizing this to type operators.  The '?' 
>> For optional could then be a postfix type operator.  And we could define our 
>> own type operators for type composition.  
> 
> Would you mind to provide a more detailed design from your perspective? I 
> mean, how do you imagine `type<>` aka. `all<>` to look like with operators?
> 
> 

The & type operator would produce a “flattened" all<> with its operands.  It 
could be overloaded to accept either a concrete type or a protocol on the lhs 
and would produce `type` for an lhs that is a type and `all` when lhs is a 
protocol.   "Type operators” would be evaluated during compile time and would 
produce a type that is used where the expression was present in the code.  This 
is a long-term idea, not something that needs to be considered right now.  It 
would be way out of scope for Swift 3.  


> Any feedback is welcome. :)
> 
> -- 
> Adrian Zubarev
> Sent with Airmail
> 
> Am 13. Mai 2016 bei 17:05:29, Matthew Johnson (matt...@anandabits.com 
> <mailto:matt...@anandabits.com>) schrieb:
> 
>> 
>> 
>> Sent from my iPad
>> 
>> On May 13, 2016, at 9:21 AM, Tony Allevato via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>>> I think there would be a certain elegance to allowing Boolean type 
>>> expressions wherever types are currently allowed, so `A & B` being a 
>>> replacement for `protocol<A, B>` might look nice, and then extend that to 
>>> allow concrete types as well. Then, if Swift ever decided to support union 
>>> types, the `|` operator naturally fits there.
>> 
>> +1
>> 
>> But maybe we should consider generalizing this to type operators.  The '?' 
>> For optional could then be a postfix type operator.  And we could define our 
>> own type operators for type composition.  
>> 
>>> 
>>> One concern though would be whether parsing would get more complicated with 
>>> deeply composed expressions. If we only supported `&`, there's no real 
>>> nesting going on. But if we wanted to be forward thinking and leave the 
>>> door open for `|`, we might need to support things like `(String | Int) & 
>>> SomeProtocol`, and I'm not enough of a parser expert to know whether that 
>>> would really complicate things (e.g., could the compiler decide easily 
>>> enough that those parentheses are part of a type expression and not a 
>>> function type?).
>>> 
>>> `all<A, B>` would be a nice compromise in that case, and leave the door 
>>> open for `any<A, B>` in the future. So I'd be supportive of either option.
>> 
>> This makes sense as an immediate step in the right direction.  I like that 
>> it is more concise than protocol<>
>>> 
>>> 
>>> On Thu, May 12, 2016 at 1:30 PM Jordan Rose via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> We've been over this a few times before on the list. I personally like 
>>> naming this thing "Any<…>" in the same vein as "AnyObject", "AnyClass", and 
>>> "AnySequence". I also see Thorsten (and in the past Brent's?) argument for 
>>> calling it "all" or "All", because it's enforcing multiple constraints.
>>> 
>>> I will say that "type" is unlikely to see much traction simply because it 
>>> is an incredibly common name for both properties and locals. We went 
>>> through that exercise when trying to name both "static" and "dynamicType" 
>>> and decided that it would be too confusing, even if we could make the 
>>> parsing work.
>>> 
>>> The feature itself has definitely been shown to be useful when working with 
>>> the Cocoa frameworks, if not in general. I don't see it on JIRA yet but we 
>>> have it internally tracked in Radar as rdar://problem/15873071 <>.
>>> 
>>> Jordan
>>> 
>>> 
>>>> On May 12, 2016, at 13:08, Adrian Zubarev via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>> 
>>>> I don’t get the part how `all<>` should allow `any<>`. Could you explain 
>>>> that a little bit in detail (I’m not familiar with Ceylon)?
>>>> 
>>>> From my point of view `any<>` is something different that I pitched here. 
>>>> `any<>` could be proposed in its own thread, because it is way different 
>>>> than `type<>`. Or can we refine the rules of `type<>` to get to `any<>`?
>>>> 
>>>> Here is a little example where `any<>` gets strange:
>>>> 
>>>> func foo(value: any<String, Int>) -> any<String, Int> {
>>>> 
>>>>     // how would one use value here?
>>>>     // what about its properties
>>>>     // what will foo return and how to use the result
>>>> }
>>>> 
>>>> One benefit of `any<>` is the replacement of overloading, at least for the 
>>>> type part of the function.
>>>> 
>>>> I’d like to propose `type<>` as the base extension to the language in that 
>>>> direction, before we’ll move forward with more complex scenarios (just 
>>>> like Chris did with generic typealias).
>>>> 
>>>> This function is clear that it only will work if you provide a subclass of 
>>>> an UIView which conforms to SomeProtocol (nice addition for library 
>>>> design).
>>>> 
>>>> func foo(value: type<UIView, SomeProtocol>) -> type<UIView, SomeProtocol> {
>>>> 
>>>>     // use it as a UIView and SomeProtocol at the same type
>>>>     return value // return type works great
>>>> }
>>>> 
>>>> We can split the value just fine:
>>>> 
>>>> let mergedValue = foo(SomeViewThatWorks)
>>>> let view: UIView = mergedValue
>>>> let protocolValue: SomeProtocol = mergedValue
>>>> 
>>>> And merge it back together:
>>>> 
>>>> guard let newMergedValue = view as? type<UIView, SomeProtocol> else { /* 
>>>> do something */ }
>>>> 
>>>> `all<>` could be seen as an alternative name for `type<>`, but to me its 
>>>> not clear what `all<>` can do, whereas `type<>` is almost like 
>>>> `protocol<>`.
>>>> 
>>>> -- 
>>>> Adrian Zubarev
>>>> Sent with Airmail
>>>> 
>>>> Am 12. Mai 2016 bei 21:40:24, Thorsten Seitz (tseit...@icloud.com 
>>>> <mailto:tseit...@icloud.com>) schrieb:
>>>> 
>>>>> Ceylon uses „&" for intersection types, i.e.
>>>>> 
>>>>> SomeRealClass & SomeProtocol
>>>>> 
>>>>> and the bar („|“) for union types, i.e. 
>>>>> 
>>>>> String | Int
>>>>> 
>>>>> That has proven to be very lightweight and readable in Ceylon where it is 
>>>>> heavily used to good effect.
>>>>> 
>>>>> 
>>>>> I agree with you that
>>>>> 
>>>>> type<SomeRealClass, SomeProtocol> 
>>>>> 
>>>>> is much nicer than protocol<> for intersection types but to keep the door 
>>>>> open for union types, I would prefer
>>>>> 
>>>>> all<SomeRealClass, SomeProtocol>
>>>>> 
>>>>> This would allow
>>>>> 
>>>>> any<String, Int>
>>>>> 
>>>>> to be used for union types.
>>>>> 
>>>>> -Thorsten
>>>>> 
>>>>> 
>>>>>> Am 12.05.2016 um 16:09 schrieb Adrian Zubarev via swift-evolution 
>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>>:
>>>>>> 
>>>>>> protocol<SomeRealClass, SomeProtocol> 
>>>>>> protocol<SomeRealStruct, SomeProtocol> 
>>>>>> 
>>>>>> This feels really odd to me. 
>>>>>> 
>>>>>> `type<SomeRealClass, SomeProtocol>` is more clear I’d say.
>>>>>> 
>>>>>> I think this would be a good addition to the type system and allow us to 
>>>>>> build more complex and type save code.
>>>>>> 
>>>>>> But still I’d love to discuss if there might be any disadvantages to 
>>>>>> this feature.
>>>>>> 
>>>>>> -- 
>>>>>> Adrian Zubarev
>>>>>> Sent with Airmail
>>>>>> 
>>>>>> Am 12. Mai 2016 bei 15:11:00, Vladimir.S (sva...@gmail.com 
>>>>>> <mailto:sva...@gmail.com>) schrieb:
>>>>>> 
>>>>>>> protocol<> 
>>>>>> _______________________________________________
>>>>>> swift-evolution mailing list
>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to