[squeak-dev] Re: Collection>>sum implementation
Klaus D. Witzel
klaus.witzel at cobss.com
Mon Aug 11 22:56:40 UTC 2008
On Mon, 11 Aug 2008 22:47:25 +0200, Randal L. Schwartz wrote:
>>>>>> "Jerome" == Jerome Peace <peace_the_dreamer at yahoo.com> writes:
> Jerome> You let it tell you:
> Jerome> any := myCollection anyone .
> Jerome> zeroElement := any - any .
Problem here is that #() has no anyone, and so #negated (assuming that sum
wants to do #+) can also not be used.
> This presumes that anything that implements #+ is also expected
> to implement #-. Yes, that was also present in the original
> but a version that doesn't require that would be nice.
Then use an object that for #+ returns a copy of the argument (no I'm not
mentioning nil :)
^ myCollection inject: mysticalObject into: [:a :b | a + b]
It *must* return some mysticalObject when myCollection is empty since one
cannot know the species of elements which are not in a collection.
This could be called an undefined object which understands #+ ;) clearly
Such things can be avoided be passing the desired zero element to
#sumFromZero: and checking the answer, so that the sender can decide what
its own zero means for an empty collection.
But if you want #sum rather than #sumFromZero: then for the numerical case
it sufficies to do
mySalarySum := myBigSalaryVector sum + 0
, sufficient because mysticalObject, assuming that's what #sum can answer
for the empty collection, returns a copy of the extra 0 for the extra #+ ;)
And a comment in #sum's method can tell how to use it properly.
More information about the Squeak-dev