Skip to main content

I did some currying today

I came across this problem on Daily Coding Problem

This problem was asked by Squarespace.

Write a function, add_subtract, which alternately adds and subtracts curried arguments. Here are some sample operations:

add_subtract(7) -> 7

add_subtract(1)(2)(3) -> 1 + 2 - 3 -> 0

add_subtract(-5)(10)(3)(9) -> -5 + 10 - 3 + 9 -> 11

I didn't have an answer from the top of my head. I decided to get some help from Google and see what I could learn in the process. Before going further in my blog post, see if you can come up with a solution and comment how that went. First thing for me was to learn about currying in javascript. The first link I came across was this one


But it does not cover infinite currying which is what I needed. I then went through a bunch of searches and articles trying to understand as much as I could. This next article stood out to me because of how simple the solution was but it could not be modified to cater for alternating addition and subtraction. To do this I figured I needed access the position in the arguments list.


Some of the things you might come across while researching are perpetual curry or infinite curry, variadic currying, partial application vs currying, arity, single level currying, composition and closure. This final link did the best in explaining currying to me and had an example of infinite currying.


I was able to modify the example to come up with a solution. This is what I have so far with minimal testing in replit.



Replit now has a mobile app which I talked about on my youtube channel - Replit Mobile App - Coding on my aging budget Android phone in Trinidad

Basically I had to check for every even argument and make that argument negative as follows

args.reduce((acc, a, l) => {
if (l%2 == 0 && l != 0) a=a*-1;

At first I had l=args.length. This was a mistake but did not matter because l is replaced by index. The 3rd parameter of reduce is the index and refers to the number of times the reducer has looped over the array. The problem does not use a terminator and an improvement to my solution would be to not use a terminator. I have never had to use currying before and there are articles that discuss real world examples of using currying. Share your thoughts with us in the comments below.

Comments

Popular posts from this blog

Hobby project - Store and view exchange rates

The next step in my project was to test out being able store and display the rates in a database. I decided to use nodejs and supabase for this. Everything worked beautifully. Only hickup was the following error due to my package.json not being correct. SyntaxError: Cannot use import statement outside a module Added this to package.json   "type": "module" This works beautifully. Right now I am just testing fragments of what could be part of a bigger system to see what is possible and what works and how easy to code on a mobile. There is no fully functioning integrated end to end system just yet. This is also what I tested. A serverless append-only database using GitHub + Actions + Pages. That’s basically a lightweight backend system. This was the ChatGPT prompt I used. Guide me through each step. This is what I want. A manually run github actions that adds to docs/data.json with the current date and time. docs/index.html displays all the entries in data.json. Make s...

What is important

Every now and again, I get reminded of the why. Why I have handed my life over to God. It is 3:08 p.m. and I have decided to write. Honestly, I feel like I could end this blog post right here. What more is there to say? God above all else. God is our compass on this journey called life. Everything else can become a distraction. Maybe not everything, but certainly many things. You get the point. What is important? What do we prioritise? What do we make time for? The answers look different for everyone. Our lives are different. We are tested differently. We are all products of our circumstances, and those circumstances vary from person to person. Yet God is the common thread across humanity and throughout time. God always was and always will be. One day, we will answer to God. We will give account to God. We cannot live without food, water, and oxygen, but all of those things come from God. So how can we live without God? How timely. I just received a notification from the Quranly app: S...

Running php and apache on termux

This was my experience getting php and apache to run on termux apt update && apt upgrade -y apt install php-apache I was following an old blog post that used php 7 and got these errors Can't locate API module structure `php7_module' in file /data/data/com.termux/files/usr/libexec/apache2/libphp.so: undefined symbol: php7_module Cannot load /data/data/com.termux/files/usr/libexec/apache2/libphp7.so Corrected in apache config file vim $PREFIX/etc/apache2/httpd.conf LoadModule php_module /data/data/com.termux/files/usr/libexec/apache2/libphp.so Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP. Comment out mpm_worker and use mpm_prefork #LoadModule mpm_worker_module libexec/apache2/mod_mpm_worker.so LoadModule mpm_prefork_module libexec/apache2/mod_mpm_prefork.so This still does not work as apache (httpd) was failing silently. According to Chatty LoadModule php_module ...libphp.so often fails in Termux becau...