> On 17 Feb 2017, at 00:00, Karl Wagner <[email protected]> wrote:
> 
> 
>> On 16 Feb 2017, at 23:44, Matthew Johnson via swift-evolution 
>> <[email protected] <mailto:[email protected]>> wrote:
>> 
>> I have been thinking a lot about enums and value subtyping lately and 
>> decided to write down the ideas I’ve been thinking about.  The result is a 
>> manifesto-style document that explores a broad landscape of features that 
>> could eventually lead to proposals (at the right time, of course).
>> 
>> I’m presenting this document to the list now mostly because I am not sure 
>> which of these features (if any) might be relevant to ABI stability, 
>> particularly with respect to standard library APIs.  I do not wish to 
>> distract the list from the focus on Swift 4, phase 1.  Let’s try not to get 
>> distracted by exciting ideas that won’t be in scope until at least phase 2.  
>> Feel free to send feedback off list if you’re interested in discussing ideas 
>> that may not be relevant to Swift evolution at this time.
>> 
>> Because this document covers a pretty broad range of topics it might be a 
>> good idea to start a new thread before jumping in to discussion about a 
>> specific aspect of it.  Please consider doing that if it is relevant before 
>> responding directly to this thread.
>> 
>> As this is a relatively large document I am only providing a link: 
>> https://gist.github.com/anandabits/5b7f8e3836387e893e3a1197a4bf144d 
>> <https://gist.github.com/anandabits/5b7f8e3836387e893e3a1197a4bf144d>
>> 
>> To whet your appetite, the topics covered include:
>> 
>> * Definition of value subtyping
>>   * Transitivity of value subtypes
>>   * Generic supertype constraints
>> * Axiomatic value subtype relationships
>> * Enums: Value Subtype Relationships by definition
>>   * Nominal case types
>>   * Nominal unions
>>   * Generic enums and Optional
>>        * Cases with unbound generic arguments
>>   * Structural Unions
>>   * Enum subtypes
>>   * Inline enum subtypes
>>   * Inline generic enum subtypes
>>   * Conditional cases (and GADTs)
>>   * Inline case types
>>   * Nominal cases with inline types
>>   * Case type implementation sharing
>>        * Shared stored properties
>>            * Subenum stored properties
>>        * Shared methods and computed properties
>> * User-defined case patterns
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
> 
> 
> 
> enum IntOrString: Int | String {
>   case Int
>   case String
> }
> 
> func takesAnonymousUnion(intOrString: Int | String) {}
> 
> Haven’t been through it all, just pointing out that “Structural unions” and 
> anonymous unions have been suggested and rejected before.
> 
> - Karl

(maybe I should elaborate on that, because you do point it out in the document)

What I mean is that the reason this was rejected before was that people should 
be using protocols instead, and building semantic contracts. “Int” and “String” 
may have a method that looks the same but behaves very differently - the union 
provides no guarantees about _behaviour_. Protocols *do* give you guarantees 
about behaviour.

Basically, the correct way to write this (today) is:

protocol CommonIntAndStringMethods {
    func doSomething()
}

enum IntOrString {
    case integer(Int)
    case string(String)
}
extension Int: CommonIntAndStringMethods {}
extension String: CommonIntAndStringMethods {}

func myFunc(_ x: IntOrString) {
    let val: CommonIntAndStringMethods
    if case .integer(let i) = x     { val = i }
    else if case .string(let s) = x { val = s }

    val.doSomething()
}

What you are proposing looks superficially similar, but isn’t. We call 
“doSomething” on a single type, with guaranteed same semantics.

- Karl

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to