On May 4, 2016, at 5:50 PM, Chris Lattner via swift-evolution 
<swift-evolution@swift.org> wrote:
> 
> Proposal link: 
> https://github.com/apple/swift-evolution/blob/master/proposals/0045-scan-takewhile-dropwhile.md
> 
> Sequence.prefix(while:) & Sequence.drop(while:) - These are *accepted* as 
> specified in revision 3 of the proposal.

I'm still a little sad we didn't go for `prefix`/`suffix` or `take`/`drop` 
pairs that linguistically matched.Nonetheless I'm gratified these are hopping 
into the language. That said, I'm going to put on my painters cap to consider 
selecting some exterior latex for the feature I was most looking forward to in 
this proposal:

Core team writes:
> unfold(_:applying:) - This addition is *rejected* by the core team as 
> written, but deserves more discussion in the community, and potentially could 
> be the subject of a future proposal.  The core team felt that the utility of 
> this operation is high enough to be worth including in the standard library, 
> but could not find an acceptable name for it.  “unfold” is problematic, 
> despite its precedence in other language, because Swift calls the 
> corresponding operation “reduce” and not “fold”.  No one could get excited 
> about “unreduce”.   “iterate” was also considered, but a noun is more 
> appropriate than an verb in this case.  Given the lack of a good name, the 
> core team preferred to reject to let the community discuss it more.

A few thoughts:

* I'm not sure why a noun is more appropriate than a verb. Reduce isn't a noun, 
prefix isn't a noun, drop isn't a noun. 
* Not a fan of unfold or unreduce, either.
* Why not `induce` as a counter to `reduce`? (induction/reduction if you want 
to noun it, which I don't)

Stepping back, the definition of `reduce` is:

    Returns the result of repeatedly calling `combine` with an accumulated 
value 
    initialized to `initial` and each element of `self`, in turn

    public func reduce<T>(initial: T, @noescape combine: (T, 
Self.Generator.Element) throws -> T) rethrows -> T

    e.g. print("Hello".characters.reduce(" ", combine: {$0 + String($1) + " "}))

The definition of whatever *this* is, is more or less:

    Returns the lazy sequence of repeatedly calling `generate` with an 
accumulated value
    initialized to `initial`. The sequence terminates when the generation 
closure returns `nil`.

    public func ???<T>(initial: T, generate: (T) -> T?) -> Sequence<T>

So why not `induce`? It's got a cute name relationship with `reduce`?

var seq = induce(10, generate: { $0 == 0 ? nil : $0 - 1 })
print(Array(seq)) // [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

seq = induce(1, generate:{ $0 * 2 }).prefix(while: { $0 < 1000 })
print(Array(seq)) // [2, 4, 8, 16, 32, 64, 128, 256, 512]

-- E


_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to