I really like the idea and where this is going, thanks for writing this
I agree that ...
syntax for type sequences might be confusing and ambiguous. I for one got a bit confused as I was reading some of the examples as if they were declaration for variadic arguments instead of type sequences sometimes, and I feel it'd be too easy to confuse them, while it's important to make clear that the different types in a T...
type sequence are not necessary the same types each as opposed to variadic arguments.
I also found it a bit confusing to see typealias Element = (Sequences.Element...)
in the zip example, as I was expecting the syntax to be more something like (Sequences...).Element
or needing some usage of _mapTypeSequence
here, as were effectively wanting the element of each archetype here.
Some alternatives I have in mind as an alternative to ...
and to avoid ambiguity:
- postfix
*
β ieT*
. Would also maybe allow things liketypealias Element = Sequences*.Element
- postfix
[]
β ieT[]
andtypealias Element = Sequences[].Element
Personal opinion on those:
- I like
*
because it's common and would work well in conjunction to introducing a potential splat operator too using*
too (a bit like in Ruby). - I like
[]
because when I seefunc debugPrint<T[]>(_ x: T[])
I think of the type sequence as being "a tuple(T0, T1, T2,β¦ Tn)
" or(T[0], T[1], β¦ T[n])
β as if those were mathematical subscripted variables, which acts as a reminder that each Tn can be different (as opposed to T... used as a variadic generic where they'd be all the same). - It would also open the door in the future to allow specifying an arity or even a range, eg
T[5]
for a type sequence / tuple with 5 (possibly different) types,T[1...]
for a type sequence of size at least 1, etc - But otoh for some subjective reason I feel like
(_ x: T[])
is less suggestive of the method allowing a variable number of (potentially heterogeneous) arguments and instead suggests an arity of one there, while I somehow feel likeT*
would make it more natural to read it as variadic arity (maybe that's my Ruby bias speaking here?)