Argument order for folds Wolfgang Corcoran-Mathe (31 Aug 2020 19:26 UTC)
Re: Argument order for folds Marc Nieper-Wißkirchen (31 Aug 2020 19:34 UTC)
Re: Argument order for folds John Cowan (31 Aug 2020 20:01 UTC)
Re: Argument order for folds Marc Nieper-Wißkirchen (31 Aug 2020 20:07 UTC)
Re: Argument order for folds Arthur A. Gleckler (31 Aug 2020 21:06 UTC)
Re: Argument order for folds Marc Nieper-Wißkirchen (01 Sep 2020 05:59 UTC)
Re: Argument order for folds Shiro Kawai (01 Sep 2020 06:25 UTC)
Re: Argument order for folds Marc Nieper-Wißkirchen (01 Sep 2020 06:33 UTC)
Re: Argument order for folds Shiro Kawai (01 Sep 2020 06:51 UTC)
Re: Argument order for folds Marc Nieper-Wißkirchen (03 Sep 2020 08:56 UTC)
Re: Argument order for folds Shiro Kawai (03 Sep 2020 10:05 UTC)
Re: Argument order for folds Marc Nieper-Wißkirchen (03 Sep 2020 11:36 UTC)

Re: Argument order for folds Marc Nieper-Wißkirchen 03 Sep 2020 08:56 UTC

My problem with it is that SRFI 1's fold (or fold-left to be more
precise) is not really a fold. Instead, it is the universal
catamorphism (the proper fold) composed with a reverse operation. The
latter, however, does not make sense for non-linear inductive data
types.

Am Di., 1. Sept. 2020 um 08:51 Uhr schrieb Shiro Kawai <xxxxxx@gmail.com>:
>
> No, I meant distinction between srfi-1 fold and fold-left ('foldl' for Haskell).
> If the vector-flavor fold family took *-fold-left there wouldn't have been a confusion.
>
>
> On Mon, Aug 31, 2020 at 8:33 PM Marc Nieper-Wißkirchen <xxxxxx@nieper-wisskirchen.de> wrote:
>>
>> The distinction between fold-left and fold-right is a different thing
>>
>> fold/fold-left is iterative; fold-right is recursive.
>>
>> The discussion here, however, is about the order of the arguments of
>> the "kons" argument of "fold". SRFI 1's fold places in kons the single
>> seed after the variadic number of list elements. This is alien to the
>> usual calling convention of Scheme where a variadic number of
>> arguments comes last.
>>
>> PS Coming back to fold and fold-right. This is another thing that SRFI
>> 1 gets somewhat wrong. The fundamental operation is fold-right, which
>> is the catamorphism. So that operation should have gotten the simpler
>> name, not fold-left, which is the composition of the catamorphism with
>> list reversal. While this sounds just like abstract nonsense, it has
>> practical implications. For most data structures, the reversal does
>> not make sense. So given whatever inductive data structure, say a
>> tree, its fold, let's call it tree-fold necessarily has to be what is
>> called fold-right for lists in SRFI 1 and not fold.
>>
>> Am Di., 1. Sept. 2020 um 08:25 Uhr schrieb Shiro Kawai <xxxxxx@gmail.com>:
>> >
>> > Srfi-1 fold is certainly an anomaly, but R6RS uses fold-left and fold-right and the distinction is clear.   As there are srfi-1 order folds as well, and srfi-1 has been around for a long time, I'd rather wish other 'standard foldl' protocol were named *-fold-left; then it'd be consistent with R6RS as well.  Alas.
>> >
>> >
>> > On Mon, Aug 31, 2020 at 7:59 PM Marc Nieper-Wißkirchen <xxxxxx@nieper-wisskirchen.de> wrote:
>> >>
>> >> Once we have an overview of all the fold-like procedures in the SRFIs,
>> >> we can think of adding a SRFI with somewhat streamlined versions. What
>> >> I am thinking is the following:
>> >>
>> >> All existing folds, which use the "wrong" order of SRFI 1, get a new
>> >> version named "foldx" (the "x" shall remind of "xcons") with the
>> >> "correct" (SRFI 133) order.
>> >>
>> >> Although this won't give us consistency in the names, this will give
>> >> us at least a consistent set of procedures. When should one use the
>> >> "foldx" instead of the "fold" version? Whenever efficiency matters and
>> >> tradition is not important.
>> >>
>> >> In the same SRFI, there should also be "starred" versions of all the
>> >> folds, e.g. fold*, which take only one sequence (e.g. a list) but any
>> >> number of seeds:
>> >>
>> >> (define (fold* proc lis . seed*)
>> >>   (let f ((lis lis) (seed* seed*))
>> >>     (if (null? lis) (apply values seed*)
>> >>        (call-with-values (lambda () (apply proc (car lis) seed*))
>> >>          (lambda seed* (f (cdr lis) seed*))))))
>> >>
>> >> NB With SRFI 210, it would look nicer:
>> >>
>> >> (define (fold* proc lis . seed*)
>> >>   (let f ((lis lis) (seed* seed*))
>> >>     (if (null? lis) (list-values seed*)
>> >>        (f (cdr lis) (list/mv (apply proc (car lis) seed*))))))
>> >>
>> >> (Even nice would be a named-let that can handle rest arguments as
>> >> multiple values without converting them into a list, but I am not sure
>> >> of how it would look like and whether it would fit into SRFI 210.)
>> >>
>> >> Marc