> There we are. I read the declaration of the function from beginning to end
> and gradually formed a rough understanding of it without needing to change
> my expectations halfway through. I still have doubts about 'insertCount',
> but I was at least able to formulate an hypothesis about its use.
> 
> YMMV, but as far as I'm concerned, the original declaration was much easier
> to understand.

I actually agree with you for this case, but not *all* type information *has* 
to be moved to the end. Try this on for size, which is actually still the most 
natural way to write this declaration in SE-0081:

internal func _arrayOutOfPlaceReplace
 <B: _ArrayBufferProtocol, C: Collection>
 (_ source: inout B, _ bounds: Range<Int>, _ newValues: C, _ insertCount: Int)
  where
  C.Iterator.Element == B.Element,
  B.Index == Int
{

Now only the relatively unimportant details—that the buffer and collection must 
have elements of the same type, and that the buffer must have integer 
indices—are at the end, whereas the basic conformances required to make any 
sense at all of the declaration are still inline.

This proposal *permits* you to hollow out the generic parameter list to the 
point of vacuousness, but that doesn't mean it's the right thing to do. It 
might make sense to ban a direct `X: Foo` requirement unless there was already 
an `X: Bar` in the generic parameter list. Or we might simply need to 
paraphrase the Perl manual page: "There are several ways to write a generic 
requirement, so consider picking the most readable one."

-- 
Brent Royal-Gordon
Architechies

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to