[swift-evolution] [Pitch] Add the sign method to the SignedNumberType protocol.

David Sweeris davesweeris at mac.com
Tue May 24 13:48:19 CDT 2016


The RawValue is an Int, but signum is a T, which I thought was the point. I tried saying `T: IntegerLiteralConvertible`, and making RawValue = T, but the playground didn’t like that. Maybe with some of Swift 3’s generic enhancements, it could be that simple.

In any case, it sounds like this might be a moot point… I was hoping raw values could be exploited to simplify the code, but if it can’t work, it can’t work.

- Dave Sweeris

> On May 24, 2016, at 1:41 AM, Charlie Monroe <charlie at charliemonroe.net> wrote:
> 
> Yes, but here, the rawValue is Int - in my code, the rawValue is NumberType, which IMHO makes more sense...
> 
>> On May 24, 2016, at 7:36 AM, David Sweeris <davesweeris at mac.com <mailto:davesweeris at mac.com>> wrote:
>> 
>> Sorry, I misspoke. I just meant define it like this:
>> public enum IntegerSign<T: SignedIntegerType> : Int {
>>     case Negative = -1
>>     case Zero = 0
>>     case Positive = 1
>>     public var signum: T {
>>         return T(self.rawValue.toIntMax())
>>     }
>> }
>> 
>> Although, come to think of it, I’m not sure if that’s an exact drop-in replacement for your code, since it’s `SignedIntegerType` instead of `SignedNumberType`
>> 
>> -Dave Sweeris
>> 
>>> On May 23, 2016, at 11:48 PM, Charlie Monroe <charlie at charliemonroe.net <mailto:charlie at charliemonroe.net>> wrote:
>>> 
>>> Sure, that's a good idea, though I'd personally use the signum var, since using rawValue seems like a bit of an abuse of the fact the enum is defined this way and doesn't help readability of the code:
>>> 
>>> enum IntegerSign<NumberType: SignedNumberType>: RawRepresentable {
>>> 
>>>     case Negative
>>>     case Zero
>>>     case Positive
>>>     
>>>     init?(rawValue: NumberType) {
>>>         if rawValue == -1 {
>>>             self = .Negative
>>>         } else if rawValue == 0 {
>>>             self = .Zero
>>>         } else if rawValue == 1 {
>>>             self = .Positive
>>>         } else {
>>>             return nil
>>>         }
>>>     }
>>>     
>>>     var rawValue: NumberType {
>>>         return self.signum
>>>     }
>>>     
>>>     var signum: NumberType {
>>>         switch self {
>>>         case .Negative:
>>>             return -1 as NumberType
>>>         case .Zero:
>>>             return 0 as NumberType
>>>         case .Positive:
>>>             return 1 as NumberType
>>>         }
>>>     }
>>>     
>>> }
>>> 
>>> extension SignedNumberType {
>>>     var sign: IntegerSign<Self> {
>>>         if self == 0 {
>>>             return .Zero
>>>         } else if self > 0 {
>>>             return .Positive
>>>         } else {
>>>             return .Negative
>>>         }
>>>     }
>>> }
>>> 
>>> 
>>> 
>>>> On May 24, 2016, at 6:09 AM, David Sweeris <davesweeris at mac.com <mailto:davesweeris at mac.com>> wrote:
>>>> 
>>>> Can we make it RawRepresentable? That way signum can just return self.rawValue
>>>> 
>>>> Sent from my iPhone
>>>> 
>>>> On May 23, 2016, at 06:05, Charlie Monroe via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>> 
>>>>> The clean way would be to make it an enum with var signum that would return -1, 0, 1:
>>>>> 
>>>>> enum IntegerSign<NumberType: SignedNumberType> {
>>>>> 
>>>>>     case Negative
>>>>>     case Zero
>>>>>     case Positive
>>>>> 	
>>>>>     var signum: NumberType {
>>>>>         switch self {
>>>>>         case .Negative:
>>>>>             return -1 as NumberType
>>>>>         case .Zero:
>>>>>             return 0 as NumberType
>>>>>         case .Positive:
>>>>>             return 1 as NumberType
>>>>>         }
>>>>>     }
>>>>> 	
>>>>> }
>>>>> 
>>>>> extension SignedNumberType {
>>>>>     var sign: IntegerSign<Self> {
>>>>>         if self == 0 {
>>>>>             return .Zero
>>>>>         } else if self > 0 {
>>>>>             return .Positive
>>>>>         } else {
>>>>>             return .Negative
>>>>>         }
>>>>>     }
>>>>> }
>>>>> 
>>>>> Charlie
>>>>> 
>>>>>> On May 23, 2016, at 9:29 AM, Haravikk via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>>>> 
>>>>>> Could you give an example of this method’s usage? Surely your value is either positive, negative or zero already, so this method doesn’t return anything more useful.
>>>>>> 
>>>>>> In other words, anywhere that I might do this:
>>>>>> 
>>>>>> 	if myValue.sign > 0 { … }
>>>>>> 
>>>>>> I could just as easily do:
>>>>>> 
>>>>>> 	if myValue > 0 { … }
>>>>>> 
>>>>>> To the same end result surely? Unless I’m missing something it seems redundant.
>>>>>> 
>>>>>> If there is a use-case for this, would it make more sense to have the return type as an enum with cases for Positive, Negative and Zero?
>>>>>> 
>>>>>>> On 22 May 2016, at 08:07, Adam Nemecek via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>>>>> 
>>>>>>> Howdy,
>>>>>>> I think that the SignedNumberType should implement a method called sign that will return -1 for negative numbers, 0 for 0 and 1 for positive numbers. This is similar to the signum method in e.g. Java and similarly called methods in other languages.
>>>>>>> 
>>>>>>> The implementation is fairly straight forward
>>>>>>> 
>>>>>>> extension SignedNumberType {
>>>>>>>   var sign: Self {
>>>>>>>     if self == 0 {
>>>>>>>       return 0
>>>>>>>     }
>>>>>>>     else if self > 0 {
>>>>>>>       return 1
>>>>>>>     }
>>>>>>>     return -1
>>>>>>>   }
>>>>>>> } 
>>>>>>> 
>>>>>>> I was trying to implement is without branching by doing (x > 0) - (x < 0) but I couldn't get the types right so I'm open to suggestions.
>>>>>>> 
>>>>>>> 
>>>>>>> _______________________________________________
>>>>>>> swift-evolution mailing list
>>>>>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>> 
>>>>>> _______________________________________________
>>>>>> swift-evolution mailing list
>>>>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>> 
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> 
>> 
> 

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


More information about the swift-evolution mailing list