Functional Programming 101
“Amazing!” that was my initial reaction when I heard and read about functional programming , I am very new to the whole concept so I might go a little off while writing about it so I am open to criticism . This is basically my understanding about functional programming and why I got hooked to it .
Functional Programming is a concept just like Object Oriented Programming , a lot of people confuse these concept and start relating to a particular language , thing that needs to be clear is languages are tools to implement concepts. There is imperative programming where you tell the machine what to do ? For example
Assign x to y
Open a file
Read a file
While when we specifically talk about FP
it is a way to tell how to do things ? The nearest example that I can come up with is SQL
query where you say something like
SELECT * FROM Something where bang=something and bing=something
Here we didn’t tell what to do but we told how to do it. This is what I got as a gist of functional programming where we divide our task into various functional
parts and then we tell how things have to be implemented on the data.
Some of the core concepts that I came across was pure functions
and functions treated as first class citizen
or first class object
. What each term means lets narrow it down .
Pure functions
is a function whose return value is determined by the input given, the best example of pure functions
are Math
functions for example Math.sqrt(x)
will return the same value for same value of x
. Keeping in mind that x
will never be altered. Lets go on a tangent and see that how this immutability
of x is a good thing, this actually prevents data from getting corrupt. Okay! That is alot to take in one go, lets understand this with a simple borrowed example from the talk I attended.
We will take example of a simple Library System
now for every library system there should be a book store, the book store
here is an immutable
data structure now what will happen if I want to add a new book to it ? Since it is immutable
I can’t modify it , correct ? So a simple solution to this problem is every time I add or remove a book I will actually deliver a new book store
and this new book store will replace the old one. That way I can preserve the old data because hey we are creating a whole new store. This is probably the gist or pros of functional programming.
book_store = ["Da Vinci's Code", "Angles and Demons", "The Lost Symbol"] def add_book( book_store, book): new_book_store = [] map(lambda old_book: new_book_store.append(old_book), book_store) new_book_store.append(book) return new_book_store
print add_book(book_store, "Inferno") # ["Da Vinci's Code", "Angles and Demons", "The Lost Symbol", "Inferno"]
print book_store # ["Da Vinci's Code", "Angles and Demons", "The Lost Symbol"]
In the above code you can actually see that a new book store
is returned on addition of a new book. This is what a pure function looks like.
Function as first class citizens
, I can relate a lot to this because of python where we say that everything is a first class objects. So, basically when we say functions are first class citizen we are implying that functions
can be assigned to a variable, passed as a parameter and returned from a function. This is way more powerful then it sounds this bring a lot modular behavior to the software you are writing, it makes the project more organized and less tightly coupled. Which is a good thing in case you want to make quick changes or even feature related big changes.
def find_odd(num): return num if(num%2 != 0) else None
def find_even(num): return num if(num%2 == 0) else None
def filter_function(number_list, function_filter): return [num for num in number_list if(function_filter(num) != None)]
number_list = [1,2,3,4,5,6,7,8,9] print filter_function(number_list, find_odd) # [1,2,5,7,9] print filter_function(number_list, find_even) # [2,4,6,8]
In the above code you can see that function is passed as an argument to another function.
I have not yet explored into lambda calculus
which I am thinking of getting into . There is a lot more power and beauty in functional programming. I want to keep this post a quick read so I might cover some code example later, but I really want to demonstrate this code.
def fact(n, acc=1): return acc if ( n==1 ) else fact(n-1, n*acc)
where acc=1
this is pure textbook
and really beautiful code which calculates factorial of n
, when it comes to FP
it is said To iterate is Human, to recurse is Divine
. I will leave you to think more about it, will try to keep writing about things I learn.
Happy Hacking!