- #reduce: exists in Pharo and calls #foldLeft: which also deals with more than two block arguments
Both of which are not present in VW. Hence, I used the following messages in VW with no name clash:
- #reduce: aReduction "= block + initial value"
- #reduce:init: is similar to #inject:into: but executes an additional completion action
Some obvious ways to avoid a clash in Pharo are:
1) Make #reduce: distinguish between a reduction and a simple block (e.g. by double dispatch)
2) Rename the transducers #reduce: to #injectInto: and adapt #inject:into: to optionally do the completion
3) Find another selector that is not too counter-intuitive
All three approaches have some downsides in my opinion:
1) Though straight forward to implement, both flavors behave quite different, especially with respect to the number of block arguments. The existing one creates a SequenceableCollection and partitions it according to the required number of args. Transducers' #reduce: considers binary blocks as the binary fold case but ternary blocks as fold with indexed elements.
2) This is a real extension of #inject:into: but requires to touch multiple implementations of that message. Something I consider undesirabe.
3) Currently, I cannot think of a good name that is not too far away from what we're familiar with.
Do you have some constructive comments and ideas?
Kind regards,
Steffen
Steffen M��rcker schrieb am Donnerstag, 13. April 2023 17:11:15 (+02:00):
:-D I don't know how compress made onto that site. There is not even an example in the list of language examples where fold/reduce is named compress.
Richard O'Keefe schrieb am Donnerstag, 13. April 2023 16:34:29 (+02:00):
OUCH. Wikipedia is as reliable as ever, I see.
compress and reduce aren't even close to the same thing.
Since the rank of the result of compression is the same
as the rank of the right operand, and the rank of the
result of reducing is one lower, they are really quite
different. compress is Fortran's PACK.
On Fri, 14 Apr 2023 at 01:34, Steffen M��rcker <
merkste@web.de> wrote:
Hi Richard and Sebastian!
Kind regards,
Steffen
Richard O'Keefe schrieb am Donnerstag, 13. April 2023 13:16:28 (+02:00):
The standard prelude in Haskell does not define anything
called "fold". It defines fold{l,r}{,1} which can be
applied to any Foldable data (see Data.Foldable). For
technical reasons having to do with Haskell's
non-strict evaluation, foldl' and foldr' also exist.
But NOT "fold".
Hello Steffen,
Let's take Kotlin documentation (https://kotlinlang.org/docs/collection-aggregate.html#fold-and-reduce)
> The difference between the two functions is that fold() takes an initial value and uses it as the accumulated value on the first step, whereas the first step of reduce() uses the first and the second elements as operation arguments on the first step.
Naming is not so consistent in all the programming languages, they mix up the names "reduce" and "fold". For example in Haskell "fold" does not take an initial value, so it is like a "reduce" in Kotlin. In Kotlin, Java, Scala and other oo languages "reduce" does not take an initial value while "fold" does. Pharo align with those languages (except that out fold is called #inject:into:)
So for me the Pharo methods #reduce: and #inject:into represent well what they are doing and they are well named.
Cheers,
Sebastian
----- Mail original -----
> De: "Steffen M��rcker" <merkste@web.de>
> ��: "Any question about pharo is welcome" <pharo-users@lists.pharo.org>
> Envoy��: Mercredi 12 Avril 2023 19:03:01
> Objet: [Pharo-users] Collection>>reduce naming
> Hi!
>
> I wonder whether there was a specific reason to name this method #reduce:?
> I would have expected #fold: as this is the more common term for what it
> does. And in fact, even the comment reads "Fold the result of the receiver
> into aBlock." Whereas #reduce: is the common term for what we call with
> #inject:into: .
>
> I am asking not to annoy anyone but out of curiosity. It figured this out
> only by some weird behaviour after porting some code that (re)defines
> #reduce .
>
> Ciao!
> Steffen
--
Gesendet mit Vivaldi Mail. Laden Sie Vivaldi kostenlos von vivaldi.com herunter.