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