Even though we haven’t been able to completely agree on the resolution, I feel we can agree that we need to change something. I’ve opened an issue and copied the messages from this thread into it for documentation.
https://pharo.fogbugz.com/f/cases/17174/Unify-sum-sum-sumNumbers-and-detectSum Cheers, Max > On 01 Dec 2015, at 18:41, Sven Van Caekenberghe <[email protected]> wrote: > > >> On 01 Dec 2015, at 17:43, Tudor Girba <[email protected]> wrote: >> >> Hi, >> >>> On Dec 1, 2015, at 3:24 PM, Sven Van Caekenberghe <[email protected]> wrote: >>> >>> Doru, >>> >>>> On 01 Dec 2015, at 15:11, Tudor Girba <[email protected]> wrote: >>>> >>>> Hi, >>>> >>>>> On Dec 1, 2015, at 12:52 PM, Sven Van Caekenberghe <[email protected]> wrote: >>>>> >>>>> >>>>>> On 01 Dec 2015, at 12:45, Stephan Eggermont <[email protected]> wrote: >>>>>> >>>>>> On 01-12-15 11:46, Sven Van Caekenberghe wrote: >>>>>>> The basic question for me is, what should >>>>>>> >>>>>>> #() sum >>>>>>> >>>>>>> return. Right now, it is an error, I would very much like that for this >>>>>>> common case the result would be 0. There is a lot of power (easy of >>>>>>> use) in a unary selector, we should not destroy that with semantics >>>>>>> that force a test before using it. >>>>>> >>>>>> I like the error, it aligns with most of our collection protocol. >>>>> >>>>> I hate the error, a lot ;-) >>>>> >>>>>> It shows the need for #sum:ifEmpty: though >>>>> >>>>> Yes, as long as #() sum == 0 >>>> >>>> That won’t work :). >>> >>> Why ? Please explain. >>> >>>>> I want the simplest case to be simple, having a non-0 default is a >>>>> special case IMHO >>>> >>>> That is why you have sumNumbers:. We could also add Collection>>sumNumbers. >>>> >>>> We had this discussion at length before Pharo 4, and this is when we >>>> agreed to add sumNumbers: and let sum: be generic (like the name says it >>>> should be) and not assume that it should work with Numbers. >>> >>> It is not about numbers or not, you are still using #+ in your generic >>> case, that is numeric in my book. It is about the zero element and how to >>> deal with an empty collection. >>> >>> The current solution, which was indeed recently added, leaves the problem >>> of what to do with an empty collection. There is no general solution, you >>> have to specify a zero element. >> >> Exactly. >> >>> But for most people in most cases that will be effectively 0, so lets make >>> the unary #sum respect that. (And unary #sum will also work for non-empty >>> non-zero based objects). The less common case can then use the longer >>> message. >> >> You said it correctly: “most” :). That is why, a generic meaning should be >> left generic and provide a solution that will work with “all” cases :). >> >> It’s a matter of choice, but sum: has a too generic meaning to have it >> confined to numbers. > > I think we all mean the same thing and understand each other's point. > > But the first meaning of 'sum' in Wikipedia leads to > https://en.wikipedia.org/wiki/Summation which talks about numbers. I studied > partly Mathematics, so I know there are different numeric systems and > abstractions. My point is: the common case is adding (simple) numbers, the > special case is the more general one, hence the best selector, #sum, should > work for the common case, including for the empty one. > > Consider also Ben's link: > > https://en.wikipedia.org/wiki/Empty_sum > > Hence my suggestion to change #sum to > > | sum sample | > self isEmpty ifTrue: [ ^ 0 ]. > sample := self anyOne. > sum := self inject: sample into: [ :accum :each | accum + each ]. > ^ sum - sample > > And the same for #sum: > > Note that the above *will* work for all like today, just not if they are > empty. Now, of course we will need the ifEmpty: variants for what I consider > the less common cases. > > Can I also remark that both #inject:into: and #fold: are perfectly fine for > more involved cases. We have a lot of API ;-) > >> Cheers, >> Doru >> >>>> Cheers, >>>> Doru >>>> >>>>> >>>>>> Stephan >>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>> >>>> -- >>>> www.tudorgirba.com >>>> >>>> "Speaking louder won't make the point worthier." >>> >>> >> >> -- >> www.tudorgirba.com >> >> "Next time you see your life passing by, say 'hi' and get to know her." > >
