A Deep Dive Into Functional Programming (Part 1)
Tags: webdev, javascript, beginners, programming
Published: 2024-01-15 14:19:01

Hey there, fellow code explorers! Imagine coding as a conversation, where functions are your eloquent words, weaving tales of logic and elegance. In this blog, we're diving into the world of functional programming—a place where coding becomes an art form. So grab a virtual cup of coffee, cozy up, and let's chat about the beauty of writing code that's not just functional but downright poetic. Ready for a journey that might just change the way you see programming? Let's embark together!

In this blog, we'll be looking at the 
1. History of functional programming.

2. What functional programming means.

3. The difference between Imperative programming and declarative programming.

We'll also be using JavaScript to illustrate some examples, so some familiarity with JavaScript's syntax is necessary.

**History of functional programming**

Imagine winding the clock back to the late 1950s, when a groundbreaking idea was taking shape in the realm of computer science. It all started with lambda calculus and mathematical logic, laying the foundation for what we now know as functional programming.

In this journey, Lisp emerged as a trailblazer, introducing the world to the concept of functional programming. As the years rolled on, Haskell, ML, and a host of other languages joined the chorus, shaping the landscape of functional programming.

Fast forward to the present day, and the influence of functional programming extends far beyond its niche beginnings. It has seeped into the mainstream, leaving its mark on languages like Scala, and Clojure, and even making unexpected appearances in familiar languages like JavaScript and Python.


**What's functional programming?**
Imagine programming like building with LEGO bricks. Functional programming is like creating structures using special blocks called "mathematical functions." These functions are like magic machines – you put something in, and they always give you the same thing back.

In functional programming, we have a rule: once we decide what a block looks like, it stays that way forever. We don't change it; it's like saying a red LEGO stays red.

Now, think of a function as a superhero. A pure function is a superhero that always does the same cool trick when you ask it to, and it never messes up your other toys. No surprises, just consistency.

Functions are treated like the main characters in our LEGO story. You can give them capes, swap them around, or even have them team up. It's like having a team of superheroes that can work together in different ways.

And there's another cool thing – higher-order functions. They are like special team leaders. They can tell other functions what to do or even bring in new superheroes to join the action.

So, in functional programming which falls under the layer of declarative programming, 
we build our LEGO world by sticking to rules, using reliable superheroes (pure functions), treating them like the stars of the show, and letting special leaders (higher-order functions) guide the adventure. It's a way of building things that's organized, predictable, and a lot of fun!


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pe0bbrcrct4o4f3fl9e8.jpg)


**Differences between Imperative and Declarative programming**

The main difference between imperative and declarative programming lies in how they express the logic of a program:

1. **Imperative Programming:**
   - **How to Achieve:** Imperative programming focuses on specifying the steps the computer should take to perform a task. It involves explicit commands, statements, and details about how to manipulate the program state.
   - **Mutable State:** It often involves changing the state of variables and data structures during the execution of the program.
   - **Example:** Procedural programming, Object-Oriented Programming (OOP) (when used imperatively).

2. **Declarative Programming:**
   - **What to Achieve:** Declarative programming emphasizes expressing the desired outcome without specifying the detailed steps for achieving it. It's more concerned with the "what" rather than the "how."
   - **Immutable State:** It often involves immutability and avoids explicit manipulation of program state. Instead, it describes relationships and dependencies.
   - **Example:** Functional programming, SQL (for database queries), HTML (for describing the structure of web pages).

In essence, imperative programming is like giving detailed instructions, while declarative programming is like stating what you want, letting the system figure out how to achieve it. Each approach has its strengths and is suited to different types of problems.

In conclusion, functional programming emerges as a captivating journey in the coding realm, where mathematical functions become the eloquent words crafting logic and elegance. From its historical roots in lambda calculus to the present-day influence on mainstream languages, functional programming stands as an art form, transforming code into a poetic narrative.

In this LEGO world of programming, functional programming adheres to rules, employing reliable superheroes (pure functions) as stars, and letting special leaders (higher-order functions) guide the adventure. It's an organized, predictable, and enjoyable approach to constructing digital creations.

As we compare paradigms, the distinction between imperative and declarative programming becomes clear. Imperative, like detailed instructions, contrasts with declarative, a statement of desired outcomes, letting the system figure out how to achieve them. Each approach brings its strengths, suited to different coding landscapes.

In Part 2 of this blog, we'll delve deeper into the features of functional programming, exploring concepts like immutability, pure functions, higher-order functions, and more. Brace yourselves for a closer look at the building blocks that make functional programming a powerful and expressive paradigm. Stay tuned for the next chapter in our coding adventure!