[swift-evolution] [swift-evolution-announce] [Review] SE-0045: Add scan, prefix(while:), drop(while:), and iterate to the stdlib
Dave Abrahams
dabrahams at apple.com
Fri Apr 29 17:33:58 CDT 2016
on Fri Apr 29 2016, Kevin Ballard <swift-evolution at swift.org> wrote:
> On Thu, Apr 28, 2016, at 11:48 AM, Joe Groff via swift-evolution wrote:
>> One thing I've been thinking about with regards to the existing
>> `reduce` operation is whether it would be better expressed in Swift
>> as taking its closure as (inout State, Element) -> Void rather than
>> (State, Element) -> State. Doing so would avoid many of the
>> accidentally-quadratic issues with the current formulation of
>
>> reduce:
>>
>> arrayOfArrays.reduce([], combine: +) // quadratic temporary arrays
>> arrayOfArrays.inPlaceReduce([], combine: +=) // can be linear by appending arrays in-place
>>
>> Thanks to the scoped semantics of `inout`, there's no hazard of the
>> mutable state reference being escaped, so the inout form is
>> isomorphic to the traditional pure form of reduce.
>>
>> Now `scan`-ing to generate an array of intermediate arrays is
>> inherently quadratic, since each intermediate array shows up as a
>> distinct copy in the resulting collection. However, if someone used
>> `scan` to produce a sequence of tree data structures instead of flat
>> arrays, it could still be interesting to share structure among the
>> intermediate states collected by `scan` by performing an in-place
>> operation to generate new values instead of an out-of-place
>> operation. It might be interesting to consider a similar signature
>> change to `scan` for these same reasons.
>
> That's an interesting idea. Taking the state as an inout parameter
> seems useful, but it does mean breaking with precedent from other
> languages and I do worry slightly about the ergonomics (not all
> operations have mutating counterparts,
That's easy; you just mutate the whole state using assignment in the
closure:
state = nonmutating(state)
> though you could also say that there's mutating methods that don't
> have trivial non-mutating versions too).
That one is harder unless you know you have value semantics; you need a
way to copy the state to create a non-mutating operation from a mutating one.
> That said, regarding using `scan` to produce a sequence of tree data
> structures, I'd expect non-mutating operations to be able to share
> state just as effectively as COW mutating operations.
Good point.
--
Dave
More information about the swift-evolution
mailing list