[swift-evolution] [Pitch] Revamp Optional and Throws
Vladimir.S
svabox at gmail.com
Tue May 2 05:35:48 CDT 2017
On 02.05.2017 8:17, Gor Gyolchanyan via swift-evolution wrote:
> One major thing to keep in mind is how exactly will it behave in generic contexts.
> As a similar example, if you can do this:
>
> func foo<A, B>(pass parameter: A, to closure: (A) -> B) -> B {
> closure(parameter)
> }
>
> func bar(one: Int, two: Double, three: String) {
> print(“\(one) \(two) \(three)")
> }
>
> foo(pass: (1, 2.0, “3”), to: bar)
>
Sorry for the offtopic in this thread, but could someone clarify the destiny of
SE-0110
(https://github.com/apple/swift-evolution/blob/master/proposals/0110-distingish-single-tuple-arg.md)
which (when implemented) will disallow this code?
Will SE-0110 be included in Swift 4.0 at all?
Gor, also please note that SE-0110 should disallow sending of Void (i.e. () ) to the
function that is defined as function without parameters, i.e. this should be an error:
func foo() {..}
foo(())
> This used to work without generics, but If I’m not mistaken, a proposal was accepted
> to disallow passing tuples and the only argument of a multi-argument function,
> leaving this use case kinda magical.
> This is an enormously useful feature for generic programming (especially with the
> lack of variadic generic types), because this allows us to define higher-order
> functions that operate on any type of function, regardless of their arity.
>
> However we resolve the error issue, it has to behave in a similar way, so that
> throwing and non-throwing functions can be dealt with in a uniform way in a generic
> context without loss of information or security guarantees.
>
>> On May 2, 2017, at 12:48 AM, Rod Brown <rodney.brown6 at icloud.com
>> <mailto:rodney.brown6 at icloud.com>> wrote:
>>
>>
>>> On 2 May 2017, at 2:34 am, John McCall <rjmccall at apple.com
>>> <mailto:rjmccall at apple.com>> wrote:
>>>
>>>>
>>>> On May 1, 2017, at 9:01 AM, Rod Brown via swift-evolution
>>>> <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>> I agree that the key problem with the current architecture that you're alluding
>>>> to is it can't be easily/stored and transferred./Swift errors are great for live
>>>> action but holding and passing after the throwing event is problematic, and this
>>>> is an elegant solution. The storage issue is when holding it as a property, and
>>>> the transferring issue is when passing it to a closure as a results of an
>>>> asynchronous operation etc. These are both definitely cases where storage of the
>>>> type-or-error makes perfect sense.
>>>>
>>>> I think the key problem getting this accepted by the Swift Team will be that it
>>>> doesn't currently have any specific use in the standard library. As a low level
>>>> set of types, errors are generated by the lower levels but rarely stored, so the
>>>> Standard library doesn't need the storage. Generally the only place we have to do
>>>> that is in end user code. And currently the standard library doesn't have to
>>>> support asynchronous operations natively, so there's nothing inside the kit that
>>>> would require it to do completion handlers with errors.
>>>
>>> We've definitely considered including a Result type, but our sense was that in an
>>> ideal world almost no code would be using it. It's hard to imagine an ordinary
>>> API that ought to be returning a Result rather than throwing, and once you've
>>> defined that away, the major remaining use case is just to shift computation
>>> around, like with a completion handler. That explicit computation-shifting
>>> pattern is something we're hoping to largely define away with something like C#'s
>>> async/await, which would leave Result as mostly just an implementation detail of
>>> such APIs. We didn't want to spend a great deal of time designing a type that
>>> would end up being so marginal, especially if the changing role would lead us into
>>> different directions on the design itself. We also didn't want to design a type
>>> that would become an obstacle to potential future language changes like, say,
>>> typed throws.
>>>
>>> The downside, of course, is that as long as we lack that async/await design,
>>> computation-shifting isn't real great.
>>>
>>> John.
>>
>> This makes sense and is sensible. I’m curious how such an API would play with the
>> existing NSURLSession completion handlers and the like, but I’m sure the community
>> can design something appropriate.
>>
>> I think the only remaining case is simply storing a result-or-error for later
>> handling, storage to disk, etc. I agree with your contention that the vast majority
>> of the use case for this type is for computation shifting. I think it would and
>> should be rare that we would want to “store” as a variable the “result-or-error”
>> type. Errors should be handled at runtime in the vast majority of cases, presented
>> to the user or otherwise handled, and then moved on from, with the reason no longer
>> being relevant.
>>
>> As you say, in the meantime, it does leave computation-shifting a bit ad-hoc and
>> convoluted, but I think the community has standardized on the Result temporary
>> solution.
>>
>>>
>>>>
>>>> This would therefore be an element in the standard library purely so we don't
>>>> have 50,000 different libraries with 50,000 different result types. I'd love to
>>>> see this standardised so frameworks were more compatible. I'm just not sure
>>>> whether the Core Team would see it as pressing to try and officiate a certain
>>>> type that they themselves don't use.
>>
>
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
More information about the swift-evolution
mailing list