reduce dimension of piddle by one by applying an operation
along the specified dimension
`
`

`
$a = sequence 5,5;
# reduce by adding all
# elements along 2nd dimension
$b = $a->reduce(add,1);
$b = $a->reduce(plus,1);
$b = $a->reduce(+,1); # three ways to do the same thing
`

[ As an aside: if you are familiar with threading you will see that
this is actually the same as

`
`

`
$b = $a->mv(1,0)->sumover
`

]

NOTE: You should quote the name of the operation (1st arg) that
you want `reduce` to perform. This is important since some of the
names are identical to the names of the actual PDL functions
which might be imported into your namespace. And you definitely
want a string as argument, not a function invocation! For example,
this will probably fail:

`
`

`
$b = $a->reduce(avg,1); # gives an error from invocation of avg
`

Rather use

`
`

`
$b = $a->reduce(avg,1);
`

`reduce` provides a simple and unified interface to the
*projection* functions and makes people coming from other
data/array languages hopefully feel more at home.

`
`

`
$result = $pdl->reduce($operation [,@dims]);
`

`reduce` applies the named operation along the specified
dimension(s) reducing the input piddle dimension by as many
dimensions as supplied as arguments. If the
dimension(s) argument is omitted the operation is applied along the first
dimension. To get a list of valid operations see canreduce.

NOTE - new power user feature: you can now supply a code
reference as operation to reduce with.

`
`

`
# reduce by summing over dims 0 and 2
$result = $pdl->reduce(\&sumover, 0, 2);
`

It is your responsibility to ensure that this is indeed a
PDL projection operation that turns vectors into scalars!
You have been warned.