My latest functional programming challenge, the cumulative sum ...

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

My latest functional programming challenge, the cumulative sum ...

OpenSCAD mailing list-2
I'm sort of enjoying this struggle a little. But it is hard getting the head
around this functional programming paradigm. I came across a beautiful
implementation of a sum:

function sum(list, i = 0) =  i < len(list) - 1 ?  list[i] + sum(list, i + 1)
: list[i];

works a char. I want to calculate a cumulative sum, using a generator of
course such that each element in the new vector is the sum of all previous
vectors and itself.

But I figured a place to start is to fix the sum above which works forwards
to one that works backwards. To clarify the sum above appears to me. Takes a
sample vector V=[1, 2, 3]:

sum(V) = 1 + 2 + 3
sum(V,1) = 2 + 3
sum(V,2) = 3

I wanted just as an exercise to reverse this logic, so that:

sum(V) = 3 + 2 + 1
sum(V,1) = 2 + 1
sum(V,2) = 1

I don't NEED this, it was just an idea  as you can see a cumulative sum in
that output emerging already.

So I tried:

function sum(list, i = 0) =  i < len(list) - 1 ?  list[len(list)-1-i] +
sum(list, i + 1)  : list[len(list)-1-i];

and if I single step this in my mind it seems right:

sum(V) = 3 + sum(V,1)
sum(V,1) = 2 + sum(V,2)
sum(V,2) = 1

but OpenSCAD returns a result of ... 8.

Clearly I've misunderstood something.

Of course as noted this isn't essential. It's an exercise. My goal is to get
a vector of cumulative sums back.

Regards,

Bernd.



--
Sent from: http://forum.openscad.org/

_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Reply | Threaded
Open this post in threaded view
|

Re: My latest functional programming challenge, the cumulative sum ...

RevarBat

-Revar


On Apr 28, 2020, at 1:16 AM, ThumbOne via Discuss <[hidden email]> wrote:

I'm sort of enjoying this struggle a little. But it is hard getting the head
around this functional programming paradigm. I came across a beautiful
implementation of a sum:

function sum(list, i = 0) =  i < len(list) - 1 ?  list[i] + sum(list, i + 1)
: list[i];

works a char. I want to calculate a cumulative sum, using a generator of
course such that each element in the new vector is the sum of all previous
vectors and itself.

But I figured a place to start is to fix the sum above which works forwards
to one that works backwards. To clarify the sum above appears to me. Takes a
sample vector V=[1, 2, 3]:

sum(V) = 1 + 2 + 3
sum(V,1) = 2 + 3
sum(V,2) = 3

I wanted just as an exercise to reverse this logic, so that:

sum(V) = 3 + 2 + 1
sum(V,1) = 2 + 1
sum(V,2) = 1

I don't NEED this, it was just an idea  as you can see a cumulative sum in
that output emerging already.

So I tried:

function sum(list, i = 0) =  i < len(list) - 1 ?  list[len(list)-1-i] +
sum(list, i + 1)  : list[len(list)-1-i];

and if I single step this in my mind it seems right:

sum(V) = 3 + sum(V,1)
sum(V,1) = 2 + sum(V,2)
sum(V,2) = 1

but OpenSCAD returns a result of ... 8.

Clearly I've misunderstood something.

Of course as noted this isn't essential. It's an exercise. My goal is to get
a vector of cumulative sums back.

Regards,

Bernd.



--
Sent from: http://forum.openscad.org/

_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Reply | Threaded
Open this post in threaded view
|

Re: My latest functional programming challenge, the cumulative sum ...

Ronaldo
In reply to this post by OpenSCAD mailing list-2
Your question made me remember my own steps years ago. Those challenges are a right track to master the unique nature of OpenSCAD.

I see no trouble with your solution. After all, the following:

echo(sum([1,2,3]));
echo(sum([1,2,3],1));
echo(sum([1,2,3],2));

results in:

ECHO: 6

ECHO: 3

ECHO: 1


for your later version of sum(). How have you gotten 8?




Em ter., 28 de abr. de 2020 às 09:16, ThumbOne via Discuss <[hidden email]> escreveu:
I'm sort of enjoying this struggle a little. But it is hard getting the head
around this functional programming paradigm. I came across a beautiful
implementation of a sum:

function sum(list, i = 0) =  i < len(list) - 1 ?  list[i] + sum(list, i + 1)
: list[i];

works a char. I want to calculate a cumulative sum, using a generator of
course such that each element in the new vector is the sum of all previous
vectors and itself.

But I figured a place to start is to fix the sum above which works forwards
to one that works backwards. To clarify the sum above appears to me. Takes a
sample vector V=[1, 2, 3]:

sum(V) = 1 + 2 + 3
sum(V,1) = 2 + 3
sum(V,2) = 3

I wanted just as an exercise to reverse this logic, so that:

sum(V) = 3 + 2 + 1
sum(V,1) = 2 + 1
sum(V,2) = 1

I don't NEED this, it was just an idea  as you can see a cumulative sum in
that output emerging already.

So I tried:

function sum(list, i = 0) =  i < len(list) - 1 ?  list[len(list)-1-i] +
sum(list, i + 1)  : list[len(list)-1-i];

and if I single step this in my mind it seems right:

sum(V) = 3 + sum(V,1)
sum(V,1) = 2 + sum(V,2)
sum(V,2) = 1

but OpenSCAD returns a result of ... 8.

Clearly I've misunderstood something.

Of course as noted this isn't essential. It's an exercise. My goal is to get
a vector of cumulative sums back.

Regards,

Bernd.



--
Sent from: http://forum.openscad.org/

_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Reply | Threaded
Open this post in threaded view
|

Re: My latest functional programming challenge, the cumulative sum ...

Dr Nicholas J Bailey
In reply to this post by RevarBat
I can't see anything wrong with that code, assuming the words all mean what I
think they mean, apart from it's going backwards ;)

I don't know OpenSCAD very well, but I'm not too bad at programming.

Here's my full program:

        function sum(list, i = 0) =  i < len(list) - 1 ?  list[len(list)-1-i]  +
sum(list, i + 1)  : list[len(list)-1-i];

        echo( sum([1,2,3]) );
        echo( sum([10, 8, 6]) );

And here's the output when I press F5:

        ECHO: 6
        ECHO: 24

That looks fine to me.

Bit of "debugging"...

        function sum(list, i=0) =
            let ( result = dosum(list, i) )
            echo(str("sum(", list, ", ", i, " = ", result) )
            result;

        function dosum(list, i) =
            i < len(list) - 1 ?
                list[len(list)-1-i]  + sum(list, i + 1)
                : list[len(list)-1-i];

        echo( sum([1,2,3]) );
        echo( sum([10, 8, 6]) );

Result:

        ECHO: "sum([1, 2, 3], 2 = 1"
        ECHO: "sum([1, 2, 3], 1 = 3"
        ECHO: "sum([1, 2, 3], 0 = 6"
        ECHO: 6
        ECHO: "sum([10, 8, 6], 2 = 10"
        ECHO: "sum([10, 8, 6], 1 = 18"
        ECHO: "sum([10, 8, 6], 0 = 24"
        ECHO: 24


--
The University of Glasgow, charity number SC004401

On Tuesday, 28 April 2020 11:25:41 BST Revar Desmera wrote:

> So I tried:
> > function sum(list, i = 0) =  i < len(list) - 1 ?  list[len(list)-1-i] +
> > sum(list, i + 1)  : list[len(list)-1-i];
> >
> > and if I single step this in my mind it seems right:
> >
> > sum(V) = 3 + sum(V,1)
> > sum(V,1) = 2 + sum(V,2)
> > sum(V,2) = 1
> >
> > but OpenSCAD returns a result of ... 8.





_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Reply | Threaded
Open this post in threaded view
|

Re: My latest functional programming challenge, the cumulative sum ...

Dr Nicholas J Bailey
OK, so I left the ')' out of the echo, but you get the gist. Do I get a B? ;)

             echo(str("sum(", list, ", ", i, " ) = ", result) )
On Wednesday, 29 April 2020 13:14:08 BST Dr Nicholas Bailey wrote:
>             echo(str("sum(", list, ", ", i, " = ", result) )





_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Reply | Threaded
Open this post in threaded view
|

Re: My latest functional programming challenge, the cumulative sum ...

MichaelAtOz
Administrator
In reply to this post by OpenSCAD mailing list-2
You may want to browse
https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Tips_and_Tricks
& examine some of the
https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Libraries#Other_Libraries





-----
Admin - email* me if you need anything,  or if I've done something stupid...

* click on my MichaelAtOz label, there is a link to email me.

Unless specifically shown otherwise above, my contribution is in the Public Domain; to the extent possible under law, I have waived all copyright and related or neighbouring rights to this work. Obviously inclusion of works of previous authors is not included in the above.

--
Sent from: http://forum.openscad.org/

_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Admin - email* me if you need anything, or if I've done something stupid...
* click on my MichaelAtOz label, there is a link to email me.

Unless specifically shown otherwise above, my contribution is in the Public Domain; to the extent possible under law, I have waived all copyright and related or neighbouring rights to this work.
Obviously inclusion of works of previous authors is not included in the above.