Recursive protocol constraints is one small-looking feature that could greatly
improve the standard library. The generics manifesto describes it this way:
"Currently, an associated type cannot be required to conform to its enclosing
protocol (or any protocol that inherits that protocol). For example, in the
standard library SubSequence type of a Sequence should itself be a Sequence:
protocol Sequence { associatedtype Iterator : IteratorProtocol ...
associatedtype SubSequence : Sequence // currently ill-formed, but should be
possible }
The compiler currently rejects this protocol, which is unfortunate: it
effectively pushes the SubSequence-must-be-a-Sequence requirement into every
consumer of SubSequence, and does not communicate the intent of this
abstraction well."
It's actually slightly worse than the above implies: the standard library has a
pile of underscore-prefixed protocols (e.g., _Sequence) specifically to dodge
this restriction. They are ugly, and we want them to go away. Many of these
places are marked with an ABI FIXME in the standard library sources.
Would someone like to write up a proposal for this feature? The syntax and
basic semantics are pretty direct, but a proposal should also capture the
expected effects on the standard library, particularly when combined with where
clauses on associated types.
I also have a nagging feeling that we will need some form of restrictions on
this feature for implementation reasons, e.g., because some recursive
constraints will form unsolvable systems.
For reference, we've already been implementing this feature. Some information
about the compiler internal issues is captured at:
https://gist.github.com/DougGregor/e7c4e7bb4465d6f5fa2b59be72dbdba6
- Doug
Sent from my iPhone
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution