## Thursday, October 21, 2010

### Before taking a dip into haskell

I have been itching to start learning another language. I have been perusing through rather a voluminous opinions on what language to learn, on the net.
Too many opinions and it could freeze you from doing something. In any case, I have taken the plunge and would start learning haskell, keeping a commentary on the same here.

Before I do that, I really wanted to have Haskell syntax highlighting support in blogger.

I am yet to test it though. so here is a snippet attached that should have been highlighted. Of course, this code is not mine and just serves to confirm that highlighting works.

module Main where

main = putStrLn "Hello, World!"



I then setup haskell compiler ghc (glasgow haskell compiler) on my mac, using macports.

sudo port install ghc
sudo port install hugs98


I googled for some good references to follow as i pick steam in haskell.

I guess, I am ready to dive in.

I have started reading "Programming in Haskell by Graham Hutton" as this seems to be the most recommended book on Haskell introduction.
I am already amazed by the introduction and clarity of differentiation that it brings about between an imperative and functional style of programming. I have to put it here.

Problem # Sum of 0..n numbers

Imperative style:

count := 0
total := 0
repeat
count := count + 1
total := total + count
until count = n


In python

count = 0
total = 0
n = 5
while (count < n):
count = count +1
total = total + count


Functional style:

sum[] =0
sum (x :xs) = x +sum xs

Just few pages and I feel this book is a must read.

A few introductory exercises in the book:

Problem #2 : Define a function product that produces the product of a list of numbers, and show using your definition that product [ 2, 3, 4 ] = 24.

product[ ] = 1
product (x :xs) = x  * product xs

product [ 2, 3, 4 ]            = 2 * product [ 3, 4 ]
= 2 * 3 * product [ 4 ]
= 2 * 3 * 4 * product [ ]
= 2 * 3 * 4 * 1
= 24


Problem #3 : How should the definition of the function qsort be modified so that it produces a reverse sorted version of a list?

qsort[] = []
qsort (x : xs) = qsort larger ++ [x ] ++ qsort smaller
where
smaller = [a | a ← xs, a ≤ x ]
larger = [ b | b ← xs , b > x ]