Recursive vs. iterative constraints
John Colvin via Digitalmars-d
digitalmars-d at puremagic.com
Sat Apr 16 02:27:28 PDT 2016
On Saturday, 16 April 2016 at 02:42:55 UTC, Andrei Alexandrescu
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?
>
>
> Andrei
Very strong preference for the first. The second is so much
harder to read (not everyone is great at thinking recursively)
and also could depend on the implementation of chain if the
return type must be inferred from the body.
More information about the Digitalmars-d
mailing list