Positive

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun Oct 5 06:42:43 PDT 2008


Janderson wrote:
> Andrei Alexandrescu wrote:
>> Hello,
>>
>>
>> (Background: Walter has kindly allowed ".()" as an alternative to the 
>> ugly "!()" for template argument specifications.)
>>
>> Just a quick question - I am feeling an increasing desire to add a 
>> template called Positive to std.typecons. Then Positive.(real) would 
>> restrict its values to only positive real numbers etc.
>>
>> The implementation would accept conversion from its base type, e.g. 
>> Positive.(real) can be constructed from a real. The constructor 
>> enforces dynamically the condition. Also, Positive.(real) accepts 
>> implicit conversion to real (no checking necessary).
>>
>> There are many places in which Positive can be useful, most notably 
>> specifications of interfaces. For example:
>>
>> Positive.(real) sqrt(Positive.(real) x);
>>
>> These specifications are also efficient because checking for 
>> positivity is done outside sqrt; if you had a Positive.(real) to start 
>> with, there is no cascading checking necessary so there's one test 
>> less to do.
>>
>> However, there is also the risk that Positive has the same fate the 
>> many SafeInt implementation have had in C++: many defined them, nobody 
>> used them. What do you think? If you had Positive in std and felt like 
>> crunching some numbers, would you use it?
>>
>> In order to get things really started, there's already been an 
>> exchange with Walter on the matter. His reply was (I haven't asked for 
>> permission, but I'm pretty sure he'd agree making it public):
>>
>> ==============
>> Honestly, I wouldn't use it. I'd rather have an in contract for sqrt 
>> that asserts the argument is positive. Also, this opens the door to 
>> Negative, NegativeOrZero, ZeroOrInfinity, Odd, Even, Prime, 
>> SixOrFifteen, etc.
>> ==============
>>
>> My answer to that was:
>>
>> ==============
>> About contracts: Let me explain how I think that's inferior to 
>> Positive in two ways.
>>
>> 1. Enough functions are defined on positive numbers only, to justify 
>> factoring that contract out of the functions themselves.
>>
>> 2. The efficiency perk is that when using several such functions 
>> together, there's only one check; once in Positive-land, no more 
>> checks are necessary.
>>
>> About proliferation of types: I don't think that follows at all. Math 
>> found positive numbers special enough to dedicate them a special 
>> notation (|R with subscript "+"). There's also a special notation for 
>> nonzero real numbers (|R with superscript "*"). There is no special 
>> notation for any of the sets you mentioned. That is bound to mean 
>> something.
>> ==============
>>
>> I'm interesting in further arguments. This feature is a numbers issue 
>> (pun not intended), meaning it will be any good only if enough people 
>> find it useful enough to actually use it in their own code and 
>> libraries, therefore building momentum behind it.
>>
>>
>> Andrei
> 
> As others have mentioned.
> 
> Why a second class form of range restriction?  Why not a first class 
> implementation like ADA's with ranges and subranges as specific 
> typedefs?  I know it would be more work for the compiler writer to 
> implement (if it can't be done in templates) however I prefer more 
> generic solutions then having many once-off solutions that crudely fit 
> together.
> 
> Being able to simply pick a type that is within the range needed would 
> save having to write contracts and static contracts all over the place. 
>  It also a great form of documentation.  I would find that useful, 
> particularly when working with algorithms that traverse arrays in 
> specific sequences such as spacial data structures but need to maintain 
> certain constraints.

Making ufloat, udouble, ureal as instantiations of Bounded.(low, high) 
is a great idea!

Andrei



More information about the Digitalmars-d mailing list