> On Aug 21, 2017, at 10:31 AM, Adrian Zubarev 
> <adrian.zuba...@devandartist.com> wrote:
> 
> 
> Hi Matthew thank you for remembering us about that draft. I’ll re-read it 
> soon. At the a quick glance I noticed the extent use of the `where` clause. 
> Wouldn’t make sense to simplify the main proposal and just focus on the 
> `where` clause for typealises only? It’s already a complex feature on its 
> own. Permitting the `where` clause in different places can sill be added 
> later in the future.

At first glance, it looks to me like the typealias would need to refer to a 
generalized existential anyway and if we can do that through a typealias we 
should probably be able to do it directly as well.  That said, if it simplifies 
the implementation in some way it might make sense as a first step.  Whether or 
not that would be the case is something I can’t speak to with any confidence.

> 
> Am 21. August 2017 um 15:10:34, Matthew Johnson (matt...@anandabits.com 
> <mailto:matt...@anandabits.com>) schrieb:
> 
>> If anyone is thinking about spending time on this topic I recommend 
>> beginning by reviewing the prior work that was done by Austin Zheng.  He has 
>> a proposal draft for enhanced existential that is very thorough.  Even if 
>> you're not planning to propose everything that's included in his draft it 
>> would be a good idea to be familiar with it.  Here's the link: 
>> https://github.com/austinzheng/swift-evolution/blob/az-existentials/proposals/XXXX-enhanced-existentials.md
>>  
>> <https://github.com/austinzheng/swift-evolution/blob/az-existentials/proposals/XXXX-enhanced-existentials.md>.
>> 
>> Sent from my iPad
>> 
>> On Aug 21, 2017, at 6:36 AM, Adrian Zubarev via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>>> It’s part of Generalized Existentials, but does not make it complete. I 
>>> think it would be worth adding more and more functionality to existentials 
>>> every year. We started first with reshaping the syntax. This year we added 
>>> support for classes. I think next year would be good to have where clause 
>>> support for typealiases.
>>> 
>>> I understand the complexity of that particular feature, and it’s a no-go 
>>> for me to help on the implementation, but I’m willing to drive the 
>>> discussion and the proposal forward with other co-authors. :)
>>> 
>>> Hasn’t it been said that the implementation must be at least a 
>>> *proof-of-concept* if the complexity is very high?
>>> 
>>> And my second question is: Wouldn’t the existence of this feature reshape 
>>> some parts of the standard library, isn’t that affecting some major goals 
>>> of Swift 5?
>>> 
>>> It would be nice if someone from the core team can clarify if the where 
>>> clause is out of scope for Swift 5 or not.
>>> 
>>> 
>>> 
>>> 
>>> Am 21. August 2017 um 12:51:48, David Hart (da...@hartbit.com 
>>> <mailto:da...@hartbit.com>) schrieb:
>>> 
>>>> 
>>>>> On 21 Aug 2017, at 11:41, Adrian Zubarev <adrian.zuba...@devandartist.com 
>>>>> <mailto:adrian.zuba...@devandartist.com>> wrote:
>>>>> 
>>>>> Yes, `where` clause is welcome to typealises (including generic ones) and 
>>>>> existentials in general. I would love to help on such proposal. I think 
>>>>> David Hart is also interested in this one. (cc)
>>>> 
>>>> Yes, this basically seems like Generalized Existentials to me and is 
>>>> mentioned in the Generics Manifesto 
>>>> <https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md>. 
>>>> It’s a feature I hold very dear but:
>>>> 
>>>> It’s a very difficult feature to implement and I think Doug Gregor is the 
>>>> only/best person to do it
>>>> I think its pretty much out of scope for Swift 5 (it’s not required for 
>>>> ABI Stability)
>>>> 
>>>> As a result, I’d be very surprised if this topic got any discussion or 
>>>> implementation time during the Swift 5 timeframe.
>>>>> Am 21. August 2017 um 11:38:14, Gor Gyolchanyan via swift-evolution 
>>>>> (swift-evolution@swift.org <mailto:swift-evolution@swift.org>) schrieb:
>>>>> 
>>>>>> Hello, Swift community!
>>>>>> 
>>>>>> I'd like to start a discussion about a possibility of constrained 
>>>>>> protocol aliases. The declaration would look like this:
>>>>>> 
>>>>>> typealias BinaryProtocol = RandomAccessCollection & MutablCollection & 
>>>>>> RangeReplaceableCollection where Binary.Index == Int, Binary.Element == 
>>>>>> Bool
>>>>>> 
>>>>>> The syntax and semantics of this declaration are exactly the same as an 
>>>>>> analogous associatedtype declaration inside a protocol.
>>>>>> In the example above, the type BinaryProtocol represents a logical array 
>>>>>> of bits and is a generic-only protocol that is usable in any context 
>>>>>> where an integer-indexed mutable range-replaceable random-access 
>>>>>> collection is expected.
>>>>>> Now, it can be used in a very concise and elegant way:
>>>>>> 
>>>>>> public protocol BinaryInitializable {
>>>>>> init<Binary>(binary: Binary) where Binary: BinaryProtocol
>>>>>> }
>>>>>> 
>>>>>> which would otherwise look very verbose and inelegant:
>>>>>> 
>>>>>> public protocol BinaryInitializable {
>>>>>> init<Binary>(binary: Binary) where Binary: RandomAccessCollection & 
>>>>>> MutablCollection & RangeReplaceableCollection, Binary.Index == Int, 
>>>>>> Binary.Element == Bool
>>>>>> }
>>>>>> 
>>>>>> Considering that smaller sets of constraints could be aliased to their 
>>>>>> own protocol and then composited into more complex aliases, this feature 
>>>>>> would dramatically improve readability and maintainability of code that 
>>>>>> uses complex constraints, that currently leads to arcane mess:
>>>>>> 
>>>>>> struct Mirror {
>>>>>> /// ...
>>>>>> init<Subject, C where C : Collection, C.Indices : Collection, 
>>>>>> C.SubSequence : Collection, C.Indices.Index == C.Index, 
>>>>>> C.Indices.SubSequence == C.Indices, C.Iterator.Element == Mirror.Child, 
>>>>>> C.SubSequence.Index == C.Index, C.SubSequence.Indices : Collection, 
>>>>>> C.SubSequence.SubSequence == C.SubSequence, C.Indices.Iterator.Element 
>>>>>> == C.Index, C.SubSequence.Indices.Index == C.Index, 
>>>>>> C.SubSequence.Indices.SubSequence == C.SubSequence.Indices, 
>>>>>> C.SubSequence.Iterator.Element == Mirror.Child, 
>>>>>> C.SubSequence.Indices.Iterator.Element == C.Index>(_ subject: Subject, 
>>>>>> children: C, displayStyle: Mirror.DisplayStyle? = default, 
>>>>>> ancestorRepresentation: Mirror.AncestorRepresentation = default)
>>>>>> /// ...
>>>>>> }
>>>>>> 
>>>>>> 
>>>>>> /// A collection that is its own sub-sequence
>>>>>> typealias RecursivelySliceableCollection = Collection where
>>>>>> RecursivelySliceableCollection.SubSequence: Collection,
>>>>>> RecursivelySliceableCollection.SubSequence.Element == 
>>>>>> RecursivelySliceableCollection.Element
>>>>>> RecursivelySliceableCollection.SubSequence.Indices == 
>>>>>> RecursivelySliceableCollection.Indices,
>>>>>> RecursivelySliceableCollection.SubSequence.SubSequence == 
>>>>>> RecursivelySliceableCollection.SubSequence
>>>>>> 
>>>>>> /// A collection that is its own index collection
>>>>>> typealias RecursivelyIndexableCollection = Collection where
>>>>>> RecursivelyIndexableCollection.Indices == RecursivelySliceableCollection,
>>>>>> RecursivelyIndexableCollection.Indices.Index == 
>>>>>> RecursivelyIndexableCollection.Index,
>>>>>> 
>>>>>> struct Mirror {
>>>>>> /// ...
>>>>>> init<Subject, C: RecursivelySliceableCollection & 
>>>>>> RecursivelyIndexableCollection, where  C.Element == Mirror.Child>(_ 
>>>>>> subject: Subject, children: C, displayStyle: Mirror.DisplayStyle? = 
>>>>>> default, ancestorRepresentation: Mirror.AncestorRepresentation = default)
>>>>>> /// ...
>>>>>> }
>>>>>> 
>>>>>> Even considering that the proposal SE-0157 
>>>>>> (https://github.com/apple/swift-evolution/blob/master/proposals/0157-recursive-protocol-constraints.md
>>>>>>  
>>>>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0157-recursive-protocol-constraints.md>)
>>>>>>  is going to make this specific use case a non-issue, the principle 
>>>>>> applies to all cases where there are commonly used complex constraints 
>>>>>> that don't necessarily involve recursive constraints.
>>>>>> 
>>>>>> Specializing Generic-Only Protocols For Non-Generic Use
>>>>>> 
>>>>>> An additional feature that would prove to be very useful would be to 
>>>>>> make a constrained protocol alias be a non-generic-only protocol if the 
>>>>>> constraints of the alias declaration specify a same-type requirement for 
>>>>>> all its associated types, while defaulted associated types would also 
>>>>>> count.
>>>>>> Example:
>>>>>> 
>>>>>> protocol Consumer {
>>>>>> associatedtype Consumable
>>>>>> mutating func consume(_ consumable: Consumable) throws
>>>>>> }
>>>>>> 
>>>>>> var consumer0: Consumer // error: Consumer is only usable in a generic 
>>>>>> context
>>>>>> 
>>>>>> typealias CharacterConsumer = Consumer where  
>>>>>> CharacterConsumer.Consumable == Character
>>>>>> 
>>>>>> var consumer1: CharacterConsumer // OK
>>>>>> 
>>>>>> The current workaround would be to declare a new protocol with protocol 
>>>>>> inheritance clauses and a where clause, but the major downside is that 
>>>>>> it introduces a completely new protocol that is not compatible with any 
>>>>>> context that expects the underlying protocols and their constraints.
>>>>>> 
>>>>>> Regards,
>>>>>> Gor Gyolchanyan.
>>>>>> 
>>>>>> _______________________________________________
>>>>>> 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

Reply via email to