The Many Faces of D - slides
Peter Alexander
peter.alexander.au at gmail.com
Sun Oct 3 23:56:01 PDT 2010
== Quote from Walter Bright (newshound2 at digitalmars.com)'s article
> This can be defined instead as:
> alias reduce!"a+b" sum;
But then you have to write:
sum(sequence, 0)
which is very unintuitive.
Haskell has foldl1 and foldr1 in addition to foldl and foldr, which partially take care of this issue (by
assuming a non-zero length list), but this is not ideal as it's perfectly reasonable to expect a sum of a
zero-length range of integers to be 0.
In an ideal world, we would be able to define reduce something like:
auto reduce(alias Func, Range)(Range range, ElementType!Range init = Identity!(Func,
ElementType!Range))
where
Identity!("a+b", int) = 0
Identity!("a*b", int) = 1
Identity!("a~b", char[]) = "";
etc.
However, what if people wrote reduce!((a, b) { return a+b; })(...) instead? There's no way you could
easily relate the two; you would have to try and equate the expression trees of the functions, which I
imagine would be no easy task, and even then you have to figure out a common syntax for Identity...
Actually, I'm now curious as to how Andrei plans on adding sum to the standard library in a way that
supports all summable types. Simply using 0 as the initialiser is incorrect, as it won't work for vectors
or matrices, and requiring the user to specify the 0 (for ints) seems unacceptable in my opinion.
More information about the Digitalmars-d
mailing list