Recursive vs. iterative constraints

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Fri Apr 15 20:46:25 PDT 2016


On Friday, April 15, 2016 22:42:55 Andrei Alexandrescu via Digitalmars-d 
wrote:
> So the constraint on chain() is:
>
> Ranges.length > 0 &&
> allSatisfy!(isInputRange, staticMap!(Unqual, Ranges)) &&
> !is(CommonType!(staticMap!(ElementType, staticMap!(Unqual, Ranges))) ==
> void)
>
> Noice. Now, an alternative is to express it as a recursive constraint:
>
> (Ranges.length == 1 && isInputRange!(Unqual!(Ranges[0])))
>
>    (Ranges.length == 2 &&
>      isInputRange!(Unqual!(Ranges[0])) &&
>      isInputRange!(Unqual!(Ranges[1])) &&
>      !is(CommonType!(ElementType!(Ranges[0]), ElementType!(Ranges[1]))
> == void))
>
>    || is(typeof(chain(rs[0 .. $ / 2], chain(rs[$ / 2 .. $]))))
>
> In the latter case there's no need for additional helpers but the
> constraint is a bit more bulky.
>
> Pros? Cons? Preferences?

The first one is way cleaner IMHO.

- Jonathan M Davis



More information about the Digitalmars-d mailing list