> On 16 Aug 2016, at 02:11, Xiaodi Wu <xiaodi...@gmail.com> wrote:
> 
> On Mon, Aug 15, 2016 at 7:03 PM, Tim Vermeulen <tvermeu...@me.com 
> <mailto:tvermeu...@me.com>> wrote:
> If I'm not mistaken, the type of T can be inferred from the `next` closure 
> here. $0 is an optional, so you end up with a sequence of optionals.
> 
> Currently, yes. But if we have both 
> 
> public func sequence<T>(first: T, next: @escaping (T) -> T?) -> 
> UnfoldFirstSequence<T> { ... }
> public func sequence<T>(first: T?, next: @escaping (T) -> T?) -> 
> UnfoldFirstSequence<T> { ... }
> 
> then $0 could be inferred to be of type `T` or `T?`, right?

I was indeed talking about replacing the first function by the second, not 
having them side by side.

> 
> And if we replace the first function with the second (instead of having 
> both), then the same code that gives you an UnfoldFirstSequence<T?> today 
> would give you an UnfoldFirstSequence<T> tomorrow, which would be the most 
> pernicious way to break code (subtle, hard to catch unless you know what 
> you're looking for, with a potentially massive difference in behavior).

I’m not sure I follow. First of all, I think an unfold sequence with an 
optional element is pretty far-fetched, but fair enough, they may exist. But 
why would the type suddenly change? Type inference would still figure out the 
right type, no? An example would be greatly appreciated, because I don’t see 
how this could form a problem.

> 
> 
> On 16 Aug 2016, at 00:51, Xiaodi Wu <xiaodi...@gmail.com 
> <mailto:xiaodi...@gmail.com>> wrote:
> 
>> Given:
>> 
>> let foo: T? = something()
>> let bar = sequence(first: foo, next: { $0?.frobnicate() })
>> 
>> If first could be of type `T` or `T?`, is bar of type `UnfoldSequence<T>` or 
>> `UnfoldSequence<T?>`?
>> On Mon, Aug 15, 2016 at 17:15 Tim Vermeulen via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> I doubt that’s it, in no way is an an empty sequence inherently unsafe. The 
>> entire standard library is built with empty sequences in mind. I’m more 
>> inclined to think it’s an oversight.
>> 
>>> On 15 Aug 2016, at 23:15, Maximilian Hünenberger <m.huenenber...@me.com 
>>> <mailto:m.huenenber...@me.com>> wrote:
>>> 
>>> Ok, I see. However this could be a potential source of bugs/performance 
>>> issues where you don't consider the nil case and you do some unnecessary 
>>> work. By prohibiting to pass nil you have to manually unwrap and you 
>>> immediately see the "optionality".
>>> 
>>> Am 15.08.2016 um 22:36 schrieb Tim Vermeulen <tvermeu...@me.com 
>>> <mailto:tvermeu...@me.com>>:
>>> 
>>>> Oh, that’s true, I misunderstood your previous message. It’s not about 
>>>> passing nil, but it’s about passing optionals. The point is to be able to 
>>>> do something like this:
>>>> 
>>>> let number = functionThatReturnsAnOptional()
>>>> sequence(first: number, next: { $0 % 2 == 0 ? $0 / 2 : nil })
>>>> 
>>>>> On 15 Aug 2016, at 22:26, Maximilian Hünenberger <m.huenenber...@me.com 
>>>>> <mailto:m.huenenber...@me.com>> wrote:
>>>>> 
>>>>> Probably I didn't understand your proposal. What do you want to change 
>>>>> exactly?
>>>>> 
>>>>> I thought:
>>>>> public func sequence<T>(first: T, next: @escaping (T) -> T?) -> 
>>>>> UnfoldFirstSequence<T> { ... }
>>>>> 
>>>>> To:
>>>>> public func sequence<T>(first: T?, next: @escaping (T) -> T?) -> 
>>>>> UnfoldFirstSequence<T> { ... }
>>>>> 
>>>>>> Am 15.08.2016 um 22:17 schrieb Tim Vermeulen <tvermeu...@me.com 
>>>>>> <mailto:tvermeu...@me.com>>:
>>>>>> 
>>>>>> You can’t; the `first` parameter has type `T`, not `T?`.
>>>>>> 
>>>>>>> On 15 Aug 2016, at 22:10, Maximilian Hünenberger <m.huenenber...@me.com 
>>>>>>> <mailto:m.huenenber...@me.com>> wrote:
>>>>>>> 
>>>>>>> Hi Tim,
>>>>>>> 
>>>>>>> If you pass "nil" to "first" isn't this an empty sequence? So it would 
>>>>>>> be redundant.
>>>>>>> 
>>>>>>> Best regards
>>>>>>> Maximilian
>>>>>>> 
>>>>>>>> Am 15.08.2016 um 01:27 schrieb Tim Vermeulen via swift-evolution 
>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>>:
>>>>>>>> 
>>>>>>>> sequence(first:next:) takes a non-optional first argument. Is there a 
>>>>>>>> reason for that? sequence(state:next:) allows empty sequences, and I 
>>>>>>>> don’t see why sequence(first:next:) shouldn’t. The fix would be to 
>>>>>>>> simply add the `?` in the function signature; no other changes are 
>>>>>>>> required to make it work.
>>>>>>>> 
>>>>>>>> I considered just filing a bug report, but since this is a change of 
>>>>>>>> the public API...
>>>>>>>> _______________________________________________
>>>>>>>> swift-evolution mailing list
>>>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>> 
>>>> 
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 

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

Reply via email to