I'm trying to figure out how to use reduce with multiply funs.

Here's my try on minmaxElement:


import std.typecons: tuple;

/** Returns: Tuple of Minmum and Maximum Element in X. */
auto minmaxElement(alias F = min, alias G = max, R)(in R range)
    @safe pure nothrow if (isInputRange!R)
{
    return reduce!(F, G)(tuple(ElementType!R.max,
                               ElementType!R.min), range);
}

unittest { assert([1, 2, 3].minmaxElement == tuple(1, 3)); }


which errors as

/home/per/opt/x86_64-unknown-linux-gnu/dmd/bin/../include/d2/std/algorithm.d(774,29): Error: can only initialize const member _expand_field_0 inside constructor /home/per/opt/x86_64-unknown-linux-gnu/dmd/bin/../include/d2/std/algorithm.d(774,29): Error: can only initialize const member _expand_field_1 inside constructor algorithm_ex.d(157,25): Error: template instance std.algorithm.reduce!(min, max).reduce!(Tuple!(const(int), const(int)), const(int)[]) error instantiating algorithm_ex.d(160,28): instantiated from here: minmaxElement!(min, max, const(int)[])


If I replace ElementType!R.min and ElementType!R.max with a values, say 0 and 1 it compiles. What is going on here?

This seems related:
http://forum.dlang.org/thread/[email protected]/issues/

Reply via email to