On Fri, May 6, 2016, at 06:15 PM, Dave Abrahams via swift-evolution wrote:
> 
> on Fri May 06 2016, Matthew Johnson <[email protected]> wrote:
> 
> >> On May 6, 2016, at 7:30 PM, Dave Abrahams via swift-evolution 
> >> <[email protected]> wrote:
> >> 
> >> 
> >> on Fri May 06 2016, Cole Campbell <[email protected]> wrote:
> >> 
> >>> I don't know if it's considered too late at this point to rename 
> >>> 'reduce', but
> >>> I'll add an enthusiastic +1 to renaming it to 'fold' and adding 'unfold'. 
> >>> 'Fold'
> >>> is just as obvious a name as 'reduce', IMO (actually I even prefer
> >>> it). 
> >> 
> >> It's not, IMO.  “Reduce” was chosen deliberately over “fold” because we
> >> think it is more in “common currency” among programmers, in no small
> >> part to the notice that MapReduce has gotten.
> >
> > I was guessing this was the rationale.  But if it’s not too late and
> > “fold” solves the “unfold” naming problem maybe we that balances out
> > the equation.
> 
> Personally, I'm not confident “unfold” would be considered to meet the
> utility bar, even if we changed the name of “reduce,” FWIW.

As I said to Chris in an off-list email, unfold() was actually the function 
that I was the most excited about in the proposal, because it allows for a very 
elegant solution to a variety of looping needs, especially now that we've 
gotten rid of the C-style for loops. One example of its use is something like

  // Iterate over self.view and all its ancestor views.
  for view in unfold(self.view, applying: { $0.superview }) {
      // ...
  }

In fact, just today I hit this exact issue and wished I had unfold(). This same 
pattern works for any case where an object has a property of the same type and 
you want to walk the entire chain, such as 
UIViewController.presentingViewController, or 
NSError.userInfo[NSUnderlyingErrorKey].

It also integrates very nicely with the other sequence methods, including 
drop(while:) and prefix(while:). For example:

  // Iterate over someView and all its ancestors, stopping at self.view
  for view in unfold(someView, applying: { $0.superview }).prefix(while: { $0 
!== self.view }) {
      // ...
  }

Incidentally, I tried writing up an example of using the stateful version to 
reimplement zip(), but it ended up being a good argument in favor of the 
suggestion someone (maybe you?) had for turning the state into an inout 
parameter.

-Kevin Ballard
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to