Blogofbrew

home

Introduction to Haskell Lab Session

01 Nov 2014

Haskell Lab

</br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

// C++
int f( int x, int y){
	return x+y;
} 
-- Haskell
f :: Int -> Int -> Int
f x y = x + y   

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Getting familiar with ghci

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Help!

:?

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Get information

:info

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Shell commands

:!

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Get the type

:t

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Loading a file

:load

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

How to read Haskell code

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Function arrows associate to the right

a -> a -> a -> a
a ->(a -> (a -> a))  

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Function application associates to the left

f g h
((f g) h)

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

We can partially apply functions

add a b = a + b
incrament x = add 1 x

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Typeclasses

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

class Eq a where 
	(==) :: a -> a -> Bool 
	(/=) :: a -> a -> Bool
instance Eq Int where
	i1 == i2 = eqInt i1 i2
	i1 /= i2 = not (i1 == i2)

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Ordering: Ord

Showable: Show

Enumerable: Enum

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Alternate Haskell Syntax

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

The function right association operator, $

f (g x )
f $ g x

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

The function composition operator

f(g(h(k x)))
f.g.h.k x

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Converting an infix function to a prefix function

f x = x + 3
f x = (+3) x

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Turn your functions into a pipeline of compositions

f x = 3 + 7/x
f = (3+).(7/) x

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>

Avoid the ‘do’ notation for IO

main = do
  putStrLn "Username:"
  name <- getLine
  putStrLn ("Hello " ++ name)
	      

main = putStrLn "Username:" >> getLine >>= putStrLn.("Hello " ++)

_ </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br> </br>