I missed that sorry.

I think it will find other uses and therefore should be ValueEnumerable. 

-- Howard.

> On 11 Jan 2018, at 6:36 pm, Paul Cantrell <cantr...@pobox.com> wrote:
> 
>> On Jan 11, 2018, at 7:28 PM, Howard Lovatt <howard.lov...@gmail.com> wrote:
>> 
>> I am in favour of a protocol that you have to explicitly declare, it feels 
>> much more like Swift to me. For example you have to say Equatable 
>> explicitly. 
> 
> Howard — Either you’ve missed something or I have. I didn’t view requiring 
> types to explicitly declare conformance as being up for debate at all.
> 
> The question I was weighing on it — what I thought Chris and Brent were 
> discussing — was whether this new protocol should be used narrowly for cases 
> of enums without associated types (which Chris favors), or whether it should 
> find more broad use to mean “type which can enumerate all of its possible 
> values” (which Brent finds interesting with caveats). This question has a 
> bearing on whether the protocol’s name should be CaseEnumerable or 
> ValueEnumerable.
> 
> In either case, the conformance is always explicitly declared; the compiler 
> merely synthesizes the implementation for enums without associated types.
> 
> I think?
> 
>> As a contra example in Java it feels natural that the compiler just provides 
>> the functionality because that is consistent across the language, you don’t 
>> declare something as equatable and you don’t tell the compiler that you want 
>> the values array generating. 
>> 
>> ‘Horses for courses’, this is what Swift does. 
>> 
>> As a more hard-core example, suppose you want to use statics as an enum like 
>> construct, e.g.:
>> 
>>     struct Ex: ValueEnumerable {
>>         let x1: Int
>>         let x2: Int
>>         init(x1: Int, x2: Int) { self.x1 = x1, self.x2 = x2 }
>>         static let allValues = [x1, x2]
>>     }
>> 
>> Perhaps the above Ex started as an enum but was changed to a struct during 
>> enhancements to the program because the values of x1 and x2 are now read in 
>> rather than constants. 
>> 
>> -- Howard.
>> 
>>> On 11 Jan 2018, at 5:21 pm, Paul Cantrell via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>> 
>>> 
>>> 
>>>> On Jan 10, 2018, at 10:21 PM, Chris Lattner via swift-evolution 
>>>> <swift-evolution@swift.org> wrote:
>>>> 
>>>> Brent, thanks for the detailed response, one question about it:
>>>> 
>>>>> On Jan 10, 2018, at 3:06 AM, Brent Royal-Gordon via swift-evolution 
>>>>> <swift-evolution@swift.org> wrote:
>>>>> 
>>>>> But that's beside the point. What I think the "`allValues` should be 
>>>>> allowed to be infinite" suggestion misses is that one of 
>>>>> `ValueEnumerable`'s semantics is that it's not only theoretically 
>>>>> *possible* to enumerate all the values, but actually *reasonable* to do 
>>>>> so.
>>>> ...
>>>>> Some types, of course, fall into a gray area. `Int8` is fairly 
>>>>> reasonable, but larger integer types get increasingly unreasonable until, 
>>>>> by `Int64`, we reach types that would take decades to enumerate. Where 
>>>>> the line should be drawn is a matter of opinion. (My opinion, to be 
>>>>> clear, is that we shouldn't conform any of them; if someone really wants 
>>>>> to do it, they can add a retroactive conformance.)
>>>> 
>>>> I’m not sure which way you’re arguing here, but that’s ok. :-)
>>>> 
>>>> In my opinion, while I can see where you are coming from (that it could be 
>>>> “reasonable” to allow random types to be ValueEnumerable) I don’t see what 
>>>> the *utility* or *benefit* that would provide.
>>>> 
>>>> If we went with a simpler design - one that named this CaseEnumerable and 
>>>> .allCases - we would be heavily biasing the design of the feature towards 
>>>> enum-like applications that do not have associated types.  This is “the” 
>>>> problem to be solved in my opinion, and would lead to a more clear and 
>>>> consistently understood feature that doesn’t have the ambiguity and “gray 
>>>> areas” that you discuss above.  Given this bias, it is clear that infinite 
>>>> sequences are not interesting.
>>>> 
>>>> Of course it would certainly be *possible* for someone to conform a 
>>>> non-enum-like type to CaseEnumerable, but that would be an abuse of the 
>>>> feature, and not a "gray area”.  
>>>> 
>>>> 
>>>> Is there some specific *utility* and *benefit* from creeping this feature 
>>>> beyond “enumerating cases in enums that don’t have associated types”?  Is 
>>>> that utility and benefit large enough to make it worthwhile to water down 
>>>> the semantics of this protocol by making it so abstract?
>>> 
>>> I gave an example in my review of an enumerable thing where the items are 
>>> analogous to cases but are not actually cases, and where I thought 
>>> `allCases` would cause confusion but `allValues` would make sense:
>>> 
>>>>> On Jan 10, 2018, at 10:22 AM, Paul Cantrell via swift-evolution 
>>>>> <swift-evolution@swift.org> wrote:
>>>>> 
>>>> Contra Chris, I slightly prefer ValueEnumerable, because it extends to 
>>>> situations where we still want to enumerate a fixed set of possibilities 
>>>> which don’t strictly correspond to enum cases but still have that sort of 
>>>> flavor. For example, one might want:
>>>> 
>>>>     enum SideOfBody
>>>>       {
>>>>       case left
>>>>       case right
>>>>       }
>>>> 
>>>>     enum Limb: ValueEnumerable
>>>>       {
>>>>       case arm(SideOfBody)
>>>>       case leg(SideOfBody)
>>>> 
>>>>       static let allValues =
>>>>         [
>>>>         arm(.left),
>>>>         arm(.right),
>>>>         leg(.left),
>>>>         leg(.right)
>>>>         ]
>>>>       }
>>>> 
>>>> To my eyes, this code reads better than it would with CaseEnumerable / 
>>>> allCases.
>>> 
>>> This raises a question related to Chris’s: what is the utility of having 
>>> Limb conform to a protocol instead of just providing allValues ad hoc? Does 
>>> CaseEnumerable / ValueEnumerable serve any purpose other than triggering 
>>> special behavior in the compiler? Would the protocol ever be used as the 
>>> type of something in code?
>>> 
>>> My answers, admittedly weak ones, are: (1) conventions are nice and 
>>> consistency is nice, and (2) you never know how an abstraction might be 
>>> used, but you do know that people will be angry when it should fit but 
>>> doesn’t. I can’t come up with a more compelling or specific argument than 
>>> those.
>>> 
>>> Cheers,
>>> 
>>> Paul
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org
>>> 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