Thank you, Hooman, that's very educational.

> On Nov 20, 2016, at 10:09 , Hooman Mehr <hoo...@mac.com> wrote:
> 
> Let me explain this a bit further:
> 
> Swift generic programming is very different from C++ template programming. 
> Swift compiler needs to type-check generic code on spot, not while 
> instantiating the template (because in Swift, instantiation can occur at 
> runtime if the generic code is from a different module).
> 
> This means that it should know what operations will be supported on the type 
> being extended. Your `Signumable` defines only a single function. IF you 
> extend `Signumable` to provide an implementation, you can’t refer to any 
> function other than `sgn()`, but you need more to be able to implement sin(). 
> This is don though generic constraints. You need to constrain the type to 
> which your extension applies. The minimal contains that you need are: 
> `ExpressibleByIntegerLiteral` and `Comparable` so that you can write the 
> algorithm as follow:
> 
> 
> The way you wrote it, would require more defined operations (subtraction):
> 
> protocol Signumable
> {
>     func sgn() -> Self
> }
> 
> extension Signumable where Self: ExpressibleByIntegerLiteral & Comparable
> {
>     func
>         sgn()
>         -> Self
>     {
>         if 0 < self { return 1 }
>         if self < 0 { return -1 }
>         return 0
>     }
> }
> 
> This can potentially work on any integer (including unsigned) and floating 
> point type and any other type that happens to support those two protocols. 
> But it does not work yet, because those types do not automatically conform to 
> `Signumable`. To make them conform you need a bit of boilerplate:
> 
> extension Int: Signumable {}
> extension Int8: Signumable {}
> extension Int16: Signumable {}
> extension Int32: Signumable {}
> extension Int64: Signumable {}
> extension UInt: Signumable {}
> extension UInt8: Signumable {}
> extension UInt16: Signumable {}
> extension UInt32: Signumable {}
> extension UInt64: Signumable {}
> extension Float32: Signumable {}
> extension Float64: Signumable {}
> extension Float80: Signumable {}
> 
> The problem is, if a new numeric type is defined say a rational number type, 
> it won’t conform automatically and you will have to declare its conformance 
> as above. For this reason, it is better to try to find an existing standard 
> protocol to extend instead of introducing your own protocol for such things.
> 
> So, as others suggested, it is better to extend the existing `SignedNumber` 
> protocol instead of introducing your own  `Signumable`, unless if you need to 
> write other generic algorithms that need your protocol as their constraints.
> 
>> On Nov 19, 2016, at 6:44 PM, Rick Mann via swift-users 
>> <swift-users@swift.org> wrote:
>> 
>> I'm trying to do this:
>> 
>> protocol Signumable
>> {
>>      func sgn() -> Self
>> }
>> 
>> extension Signumable
>> {
>>      func
>>      sgn()
>>              -> Self
>>      {
>>              let pos = 0 < self              //  Error
>>              let neg = self < 0              //  Error
>>              let p = pos ? Self(1) : Self(0)
>>              let n = neg ? Self(1) : Self(0)
>>              return p - n
>>      }
>> }
>> 
>> 
>> extension Double : Signumable {}
>> 
>> But I get
>> 
>> Binary operator '<' cannot be applied to operands of type 'Int' and 'Self'
>> 
>> I figure there should be additional constraints on Signumable.
>> 
>> Help would be much appreciated!
>> 
>> 
>> -- 
>> Rick Mann
>> rm...@latencyzero.com
>> 
>> 
>> _______________________________________________
>> swift-users mailing list
>> swift-users@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-users
> 


-- 
Rick Mann
rm...@latencyzero.com


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

Reply via email to