On 02 Dec 2015, at 15:21, Nicolai Hess <nicolaihess@gmail.com> wrote:
2015-12-02 15:03 GMT+01:00 Ben Coman <btc@openinworld.com>: On Wed, Dec 2, 2015 at 12:38 AM, Tudor Girba <tudor@tudorgirba.com> wrote:
Hi,
On Dec 1, 2015, at 5:13 PM, Max Leske <maxleske@gmail.com> wrote:
@Doru Youâre missing the point: #anyOne *fails* for empty collections.
I am not missing the point at all. I am saying that if you want sum: to be generic, it cannot assume a specific Zero object.
And sum: should be generic because of its name.
I am missing understanding the other use cases. Can you describe further the generic nature of #sum & #sum: ? I would have thought by default they only applied to numbers.
sum can be applied to anything that supports #+, not only numbers sum: can be applied to any collection with a block that return some object that supports #+
therefore you can not assume 0 (<- a number) is a proper initial value therefore you *need* to work with #anyOne and as you can not assume a proper initial value, you can not assume a default value for empty collections -> it should throw an error. If you (the caller of the function) knows what to do with an empty collection you have to check, or call inject:into: directly, with a proper initial value.
I am sorry but I am getting really tired of this, you should read what is being said. I am not suggesting to stop using #anyOne because I like why it is there and what it can do. The change I want is what happens with an empty collection when using the simplest selector, #sum. I do not want to say to some collection of numbers #sumIfEmpty: [0], because summing numbers starting from zero is the most common case and everybody expects that, hence the unary selector fits. I want the less common cases to use the more complicated API, as in some collection of colors #sumIfEmpty: [ Color black ] In my book that is common sense API design. Doing that I do no take anything away, because today you already have to make sure the collection is not empty. The only change would be in the error behaviour. I think that is a reasonable price to pay. Instead of having #anyOne fail, it will say that #+ cannot add 0 to some object, and in a comment we can point to the alternative API. http://izquotes.com/quote/242740 right ?
cheers -ben
On 01 Dec 2015, at 15:31, Esteban A. Maringolo <emaringolo@gmail.com> wrote:
I don't want to be heretic (or too orthodox), but why not to delegate this behavior to other class (an iterator maybe?).
It's too tempting adding these convenience methods to Collection and/or subclasses, but anything that requires an explicit protocol of its elements is wrong, IMO.
something like aCollection arithmetic sum: [...] or.... aCollection arithmetic avg.
Interesting thought!
+100
Doru
My two cents for this.
Regards!
Esteban A. Maringolo
-- www.tudorgirba.com
"Every thing has its own flow."