[swift-evolution] Adding Result to the Standard Library

Hooman Mehr hooman at mac.com
Tue Nov 14 21:18:12 CST 2017


Oops, forgot to put the initializers that are the most useful:

    public init(_ expression: @autoclosure () throws -> T) {
        do { self = .value(try expression() ) }
        catch { self = .error(error) }
    }
    
    public init(_ closure: () throws -> T) {
        do { self = .value(try closure()) }
        catch { self = .error(error) }
    }


> On Nov 14, 2017, at 6:57 PM, Hooman Mehr via swift-evolution <swift-evolution at swift.org> wrote:
> 
> You can support all styles with enum as well. What don’t you do this:
> 
> public enum Result<T> {
>     
>     case value(T)
>     case error(Error)
>     
>     public init(_ value: T) { self = .value(value) }
>     public init(error: Error) { self = .error(error) }
> 
>     public func get() throws -> T {
>         switch self {
>         case let .value(value): return value
>         case let .error(error): throw error }
>     }
>     
>     public func map<U>(_ transform: (T) throws -> U) throws -> U { return try transform(get()) }
>     
>     public var value: T? {
>         switch self {
>         case let .value(value): return value
>         case .error: return nil }
>     }
>     
>     public var error: Error? {
>         switch self {
>         case .value: return nil
>         case let .error(error): return error }
>     }
> }
> 
> 
>> On Nov 14, 2017, at 3:40 PM, Guillaume Lessard via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> 
>> I’m late to this particular party, but having just caught up with the thread I’m surprised that no one substantially addressed the stylistic duality that a `public enum Result` would bring.
>> 
>> In short, I’d rather Result be a struct than an enum.
>> 
>> I too implemented a Result, for obvious reasons. I was, however, unsatisfied that it added another interface for error handling, namely switching over the enum — it’s not really better, not really worse, but now there are more error handling patterns to look for in your code.
>> 
>> My solution was to simply switch to a `struct Result`, where the enum is private. The only way to get the value out is via a throwing method. See <https://gist.github.com/glessard/48f4c1305ac20b1b99c1bbdc2fb6290c <https://gist.github.com/glessard/48f4c1305ac20b1b99c1bbdc2fb6290c>> for a no-frills implementation.
>> 
>> This has all the advantages of the Result enum — it’s easily used in asynchronous situations and can implement the desired functional/monadic niceties, but without exposing an unnecessary alternate interface to Swift’s native error handling.
>> 
>> Cheers,
>> Guillaume Lessard
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20171114/8dc2cb5a/attachment.html>


More information about the swift-evolution mailing list