Hmm, brainstorming here. Given the pervasive use of `with` to mean "this
isn't accessible otherwise but inside this closure it's $0", maybe
`reduce(with: 42) { $0 += 1 }` might give a useful hint?
On Tue, Jan 24, 2017 at 13:19 Matthew Johnson <[email protected]>
wrote:> On Jan 24, 2017, at 1:01 PM, Xiaodi Wu <[email protected]> wrote: > > Hmm, it reads well, but IMO it avoids being misleading only because it > doesn't mean anything. In what way are you reducing "into" the first > argument any more so than the classic reduce function? > > > It isn't perfect, but it’s better than the alternatives I’ve seen so far. > > In the classic reduce function a new value is produced for each step of > the reduction. In this variation, each step reduces “into” an accumulator > that is initialized with the seed value. In that sense, you could say that > you reduce “into” the seed value. > > Labeling the argument `into` is a little bit of a stretch but I think it's > far superior to `mutating` which is pretty misleading at the call site. I > think it would be pretty hard to come up with something better, but let’s > keep the bikeshed going if anyone has additional ideas. > > > On Tue, Jan 24, 2017 at 12:44 Matthew Johnson via swift-evolution < > [email protected]> wrote: > > On Jan 24, 2017, at 12:36 PM, Pyry Jahkola via swift-evolution < > [email protected]> wrote: > > > Freak Show wrote: > > Am I the only one who finds this incredibly ugly and hard to read? > > This is more or less solved by inject:into: idiom. There is no reason for > inout for this particular problem. > > > Yeah, the original signature seems more useful. If you go all `inout` like > Gwendal suggested, you might as well just iterate over the sequence with > `for x in xs`, updating the state as you go. > > But your comment brought another idea to mind: if `mutating:` is > considered a bad name for a non-`inout` argument, how about ` > *reduce(into:combine:)`*, similar to what Karl suggested earlier in this > thread? > > I think it reads very well at the call site, does not suggest `inout`ness > of the argument too much (of course there's no `&` at the call site > either), and it's still easily found with auto-completion: > > let counts = words.reduce(into: [:]) { > $0[$1] = ($0[$1] ?? 0) + 1 > } > > > +1. This is concise and I think it captures the essence of what is > happening pretty well! > > The third variation where the seed argument actually *is* `inout` might > also be interesting in some cases where you *already* have a `var` that you > want to accumulate into. I believe I have done this in the past in my own > code but don’t have an example handy. > > > — Pyry > _______________________________________________ > swift-evolution mailing list > [email protected] > https://lists.swift.org/mailman/listinfo/swift-evolution > > _______________________________________________ > swift-evolution mailing list > [email protected] > https://lists.swift.org/mailman/listinfo/swift-evolution > > >
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
