A few more comments inlined now that I’ve read it.

> On May 30, 2016, at 7:44 AM, plx via swift-evolution 
> <[email protected]> wrote:
> - if you have e.g. 2+ packs, can you enforce (T…) and (U…) have the same 
> arity?

Seems the answer is yes iff there’s a `T.Foo... == U.Bar…` style relationship, 
but no way to just request same-arity by itself?

> - if you have e.g. 2+ packs, could you enforce e.g. T.Foo… == U.Bar ?

Missed this either before or you added it, sorry either way.

> 
> …as always nice-to-have, but throwing them out there for consideration.
> 
>> I'll write something up.

I like the `fold` construct but feel like for this use it needs a few more 
options-or-variants.

The first one is some more-explicit support for “early exit”.

EG for the cascading-lookup example, you can convert it to this `#fold`:

  private func lookupKey(key: K) -> V? {
    return #fold(
      start: nil,
      reducer: { 
        (table, value)
        in
        return value ?? table[key]
      },
      values: tables
    )
  }

…but unless the compiler is very savvy you are going to have a bunch of 
unneeded stuff even after your “success” (it won’t do another lookup, but it 
just seems wasteful and could be wasteful in other contexts).

Relatedly, that `#fold` is only going to work if the compiler can infer a 
proper type for the `table` argument to the `reducer`.

If you have to specify the types explicitly via a helper function, it seems 
like this won’t work:

  func lookupIfNecessary<T:LookupTable where T.Key == K, T.Value == V>(table: 
T,  key: K, value: V?) -> V? {
     return value ?? table[key]
  }

…b/c the signature isn’t right for the reducer, and it seems like this might 
work:

  func createLookupFunction<T:LookupTable where T.Key == K, T.Value == V>(key: 
K) -> (T, V?) -> V? {
     return { (t,v) in return v ?? t[key] }
  }

  private func lookupKey(key: K) -> V? {
    return #fold(
      start: nil,
      reducer: createLookupFunction(key), // <- should work…I hope...
      values: tables
    )
  }

…but it seems a bit convoluted; perhaps there’s a trick here? Or perhaps a 
variant with an adjusted signature like so:

  // perhaps inout K ? or as an option?
  #foldWithContext(context: K, start: U, reducer:(#requirements,U,K) -> U, 
values: (T…)) -> U

Relatedly, having `#fold` variants like the above that include the current 
index could address a lot of the uses for integer-based indexing:

  #indexedFold(start: U, reducer:(#requirements,U,Int) -> U, values: (T…)) -> U

…(the above can be done w/out dedicated support, but dedicated support might be 
more compiler-friendly on this one).

Finally, after reading it over again I really find the `…` confusing beyond the 
initial declaration sites (as you can perhaps tell since I’ve been mis-using it 
in my replies).

I can’t come up with an alternative that isn’t a major regression for simple 
declarations, but if a more-explicit syntax could be invented I’d highly prefer 
it.

>> 
>>> 
>>>> On May 28, 2016, at 3:03 PM, Austin Zheng via swift-evolution 
>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>> 
>>>> Hello swift-evolution,
>>>> 
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected] <mailto:[email protected]>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> [email protected] <mailto:[email protected]>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to