... where k represents the index count 1, 2, 3, ... However,
it's not evident to me how you could get reduce() to know this
counting value.
You would use zip and sequence to add indices to x, like this:
reduce!reducer(initial, zip(x, sequence!"n"))
Where calculating Q[k] is concerned, you need to know both the
index value _and_ the value of the corresponding M[k]. Again,
it's not evident to me how you'd indicate to reduce() what is
needed.
I guess reduce would need to operate on tuples of M and Q, so you
would have something like:
alias Tuple!(float, float) MQ;
MQ reducer(MQ mq, Tuple!(float, int) xi)
{
return MQ(
// compute new values or M and Q here
);
}
And you would then call reduce like this:
reduce!reducer(MQ(x.front, 0), zip(x, sequence!"n"))
You could also use Tuple of M, Q and k instead of using zip and
sequence. You would then pass MQk(x.front, 0, 0) as first
argument to reduce (I'm assuming zero based indexing here) and
simply compute the k component of the return value in reducer as
mqk[2] + 1.