[swift-evolution] Revisiting SE-0110

Mark Lacey mark.lacey at apple.com
Tue Jun 6 19:19:57 CDT 2017

> On Jun 6, 2017, at 1:59 PM, Stephen Celis <stephen.celis at gmail.com> wrote:
>> On Jun 6, 2017, at 1:43 PM, Mark Lacey via swift-evolution <swift-evolution at swift.org> wrote:
>> Unless I am missing something this is an example of tuple destructuring. I’m looking for examples of other issues.
> The destructuring issue is the most pervasive, but as mentioned it also breaks point-free style:
> https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20170529/036911.html
> Again, less common for most but heavily used by us and folks that use functional patterns and libs like RxSwift, ReactiveCocoa, etc., where a lot of streams/signals of values are composed into new structures.

Thanks for reminding me. It’s good to call out this case specifically. The underlying reason that this is disallowed for Swift 4 is the same as the underlying reason that a closure immediately passed as an argument (with with mismatching function type) is disallowed for Swift 4 (i.e. the “tuple destructuring” case). It might be possible to relax restrictions to allow one of these without allowing the other.

Having said that, I find it surprising that your tupleUp function works as it is implicitly converting the function type in a way that I would expect SE-0110 to disallow. My expectation is that it would need to be written like this:

func tupleUp<A, B, C>(_ f: @escaping (A, B) -> C) -> ((A, B)) -> C {
  return { f($0.0, $0.1) }


More information about the swift-evolution mailing list