> On Jun 30, 2017, at 5:38 AM, Matthew Johnson <matt...@anandabits.com> wrote:
> 
>> 3. If we later change `throw` from being a statement to being a 
>> `Never`-returning expression, you could use `throw` on the right-hand side 
>> of `??`.
> 
> What do you have in mind here?  I don't recall any discussion of `throw` 
> return Never.  It seems like a novel use of a bottom type that might preclude 
> the possibility of ever having a Result type that seamlessly bridges to 
> Swift's error handling.  


`throw` is currently a statement. Imagine, for sake of illustration, that it 
was instead a function. This function would take an `Error` as a parameter and 
throw it. It would never return normally—it would only return by throwing—so 
its return type would be `Never`:

        @_implicitlyTry
        func throw(_ error: Error) throws -> Never {
                try Builtin.throw(error)
                unreachable()
        }

What I'm suggesting is that `throw` should remain a keyword, but should have 
the semantics of this `throw(_:)` function. The parser should allow it in 
expression context, the `try` checker should treat it as though it was already 
marked `try`, and the type checker should treat it as an expression that 
returns `Never` but can throw.

That would then allow you to say things like:

        let lastItem = array.last ?? throw MyError.arrayEmpty

It would not have any negative effect I can think of on `Result`. In fact, 
trying to directly wrap a `throw SomeError.foo` statement in a `Result` would 
produce a `Result<Never, SomeError>`, correctly expressing the fact that the 
result of that particular expression can never be successful.

-- 
Brent Royal-Gordon
Architechies

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

Reply via email to