Functional programming is declarative
When we use SQL, we just express our intent. For example, consider this:
mysql> select count(*) from book where author like '%wodehouse%';
We just say what we are looking for. The actual mechanism that gets the answer is hidden from us. The following is a little too simplistic but suitable example to prove the point.
The SQL engine will have to loop over the table and check whether the author column contains the wodehouse
string. We really don't need to worry about the search algorithm. The author
table resides on a disk somewhere. The number of table rows that need to be filtered could easily exceed the available memory. The engine handles all such complexities for us though.
We just declare our intent. The following Scala snippet is declarative. It counts the number of even elements in the input list:
scala> val list = List(1, 2, 3, 4, 5, 6) list: List[Int] = List(1, 2, 3, 4, 5, 6) scala> list.count( _ % 2 == 0 ) res0: Int = 3
The code uses a higher order function, namely count
. This takes another function, a predicate, as an argument. The line loops over each list element, invokes the argument predicate function, and returns the count
.
Here is another example of Clojure code that shows how to generate a combination of values from two lists:
user=> (defn fun1 [list1 list2] #_=> (for [x list1 y list2] #_=> (list x y))) #'user/fun1 user=> (fun1 '(1 2 3) '(4 5 6)) ((1 4) (1 5) (1 6) (2 4) (2 5) (2 6) (3 4) (3 5) (3 6))
Note the code used to generate the combination. We use for comprehension to just state what we need done and it would be done for us.