On Tuesday, 25 March 2014 at 17:22:45 UTC, monarch_dodra wrote:
I'm working on something called "fold". It is designed as
nothing more than a replacement for "reduce", but where the
seed comes *second* in terms of arguments. It allows this:
someLongUFCSChain().reduce(intoThis);
Good! I've been greatly disturbed by this too.
Especially by the fact that reduce throws upon empty input
because it currently has no way of deducing return value. This
can be a greatly annoying "surprise" to new users.
From algebra we learn the following relations:
Operator Unit
+,(-) 0
*,(/) 1
min T.max
max T.min
..
I guess typeof return value could be deduced according + and * at
least.
Have you perhaps found a way to deduce it in the general case
using the reduce function and ElementType of input range,
something like
typeof(binaryFun(E, E))
where
alias E = ElementType!R,
I thought about adding an overload for reduce using template
restriction that would solve the problem without adding a new
function. But I guess that adding such an overload could cause
just as much confusion to programmers who are used to the current
syntax.