> On Oct 26, 2017, at 9:40 AM, Xiaodi Wu <xiaodi...@gmail.com> wrote:
> 
> On Thu, Oct 26, 2017 at 11:38 AM, Jonathan Hull <jh...@gbis.com 
> <mailto:jh...@gbis.com>> wrote:
> 
>> On Oct 26, 2017, at 9:34 AM, Xiaodi Wu <xiaodi...@gmail.com 
>> <mailto:xiaodi...@gmail.com>> wrote:
>> 
>> On Thu, Oct 26, 2017 at 10:57 AM, Jonathan Hull <jh...@gbis.com 
>> <mailto:jh...@gbis.com>> wrote:
>> 
>>> On Oct 26, 2017, at 8:19 AM, Xiaodi Wu <xiaodi...@gmail.com 
>>> <mailto:xiaodi...@gmail.com>> wrote:
>>> 
>>> 
>>> On Thu, Oct 26, 2017 at 07:52 Jonathan Hull <jh...@gbis.com 
>>> <mailto:jh...@gbis.com>> wrote:
>>>> On Oct 25, 2017, at 11:22 PM, Xiaodi Wu <xiaodi...@gmail.com 
>>>> <mailto:xiaodi...@gmail.com>> wrote:
>>>> 
>>>> On Wed, Oct 25, 2017 at 11:46 PM, Jonathan Hull <jh...@gbis.com 
>>>> <mailto:jh...@gbis.com>> wrote:
>>>> As someone mentioned earlier, we are trying to square a circle here. We 
>>>> can’t have everything at once… we will have to prioritize.  I feel like 
>>>> the precedent in Swift is to prioritize safety/correctness with an option 
>>>> ignore safety and regain speed.
>>>> 
>>>> I think the 3 point solution I proposed is a good compromise that follows 
>>>> that precedent.  It does mean that there is, by default, a small 
>>>> performance hit for floats in generic contexts, but in exchange for that, 
>>>> we get increased correctness and safety.  This is the exact same tradeoff 
>>>> that Swift makes for optionals!  Any speed lost can be regained by 
>>>> providing a specific override for FloatingPoint that uses ‘&==‘.
>>>> 
>>>> My point is not about performance. My point is that `Numeric.==` must 
>>>> continue to have IEEE floating-point semantics for floating-point types 
>>>> and integer semantics for integer types, or else existing uses of 
>>>> `Numeric.==` will break without any way to fix them. The whole point of 
>>>> *having* `Numeric` is to permit such generic algorithms to be written. But 
>>>> since `Numeric.==` *is* `Equatable.==`, we have a large constraint on how 
>>>> the semantics of `==` can be changed. 
>>> 
>>> It would also conform to the new protocol and have it’s Equatable 
>>> conformance depreciated. Once we have conditional conformances, we can add 
>>> Equatable back conditionally.  Also, while we are waiting for that, Numeric 
>>> can provide overrides of important methods when the conforming type is 
>>> Equatable or FloatingPoint.
>>> 
>>> 
>>>> For example, if someone wants to write a generic function that works both 
>>>> on Integer and FloatingPoint, then they would have to use the new protocol 
>>>> which would force them to correctly handle cases involving NaN.
>>>> 
>>>> What "new protocol" are you referring to, and what do you mean about 
>>>> "correctly handling cases involving NaN"? The existing API of `Numeric` 
>>>> makes it possible to write generic algorithms that accommodate both 
>>>> integer and floating-point types--yes, even if the value is NaN. If you 
>>>> change the definition of `==` or `<`, currently correct generic algorithms 
>>>> that use `Numeric` will start to _incorrectly_ handle NaN.
>>> 
>>> 
>>> #1 from my previous email (shown again here):
>>>>> Currently, I think we should do 3 things:
>>>>> 
>>>>> 1) Create a new protocol with a partial equivalence relation with 
>>>>> signature of (T, T)->Bool? and automatically conform Equatable things to 
>>>>> it
>>>>> 2) Depreciate Float, etc’s… Equatable conformance with a warning that it 
>>>>> will eventually be removed (and conform Float, etc… to the partial 
>>>>> equivalence protocol)
>>>>> 3) Provide an '&==‘ relation on Float, etc… (without a protocol) with the 
>>>>> native Float IEEE comparison
>>> 
>>> 
>>> In this case, #2 would also apply to Numeric.  You can think of the new 
>>> protocol as a failable version of Equatable, so in any case where it can’t 
>>> meet equatable’s rules, it returns nil.
>>> 
>>> Again, Numeric makes possible the generic use of == with floating-point 
>>> semantics for floating-point values and integer semantics for integer 
>>> values; this design would not.
>> 
>> Correct.  I view this as a good thing, because another way of saying that 
>> is: “it makes possible cases where == sometimes conforms to the rules of 
>> Equatable and sometimes doesn’t."  Under the solution I am advocating, 
>> Numeric would instead allow generic use of '==?’.
>> 
>> I suppose an argument could be made that we should extend ‘&==‘ to Numeric 
>> from FloatingPoint, but then we would end up with the Rust situation you 
>> were talking about earlier…
>> 
>> This would break any `Numeric` algorithms that currently use `==` correctly. 
>> There are useful guarantees that are common to integer `==` and IEEE 
>> floating-point `==`; namely, they each model equivalence of their respective 
>> types at roughly what IEEE calls "level 1" (as numbers, rather than as their 
>> representation or encoding). Breaking that utterly eviscerates `Numeric`.
> 
> Nope.  They would continue to work as they always have, but would have a 
> depreciation warning on them.  The authors of those algorithms would have a 
> full depreciation cycle to update the algorithms.  Fixits would be provided 
> to make conversion easier.
> 
> After the depreciation cycle, Numeric would no longer guarantee a common 
> "level 1" comparison for conforming types.

It would, using ==?, you would just be forced to deal with the possibility of 
the Equality relation not holding.  '(a ==? b) == true' would mimic the current 
behavior.






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

Reply via email to