introduction to haskell

45
Introduction to Haskell Luca Molteni Haskell ITA Meeting 17/10/2015

Upload: luca-molteni

Post on 15-Apr-2017

1.158 views

Category:

Software


0 download

TRANSCRIPT

Introduction to Haskell

Luca Molteni

Haskell ITA Meeting 17/10/2015

Topics

Basic Concepts

Currying

Functors

• Functions are first-class, that is, functions are values which can be used in exactly the same ways as any other sort of value.

• The meaning of Haskell programs is focused around evaluating expressions rather than executing instructions.

3 * (9 + 5)

=> 3 * 14

=> 42

3 * (9 + 5)

=> 3 * 9 + 3 * 5

=> 27 + 3 * 5

=> 27 + 15

=> 42

simple x y z = x * (y + z)

simple 3 9 5

=> 3 * (9 + 5)

=> 3 * 14

=> 42

“An expression is said to be referentially transparent if it can be replaced with its value

without changing the behavior of a program (in other words, yielding a program that has the same effects and output on the same input).”

Referential transparency

simple a b c = simple a c b

simple a b c

=> { unfold }

a * (b + c)

=> { commutativity }

a * (c + b)

=> { fold }

simple a c b

x = x + 1

x = x + 1x

=> x + 1

=> (x + 1) + 1

=> ((x + 1) + 1) +1

=> (((x + 1) +1) +1) +1

...

“Because a referentially transparent expression can be evaluated at any time, it is not

necessary to define sequence points nor any guarantee of the order of evaluation at all.

Programming done without these considerations is called

purely functional programming.”

Referential transparency

totalArea r1 r2 r3

= pi * r1 ^ 2 +

pi * r2 ^ 2 +

pi * r3 ^ 2

Sum of the areas of three circles with radii r1, r2, r3

circleArea r = pi * r ^ 2

totalArea r1 r2 r3

= circleArea r1 +

circleArea r2 +

circleArea r3

Sum of the areas of three circles with radii r1, r2, r3

r1 = 3

r2 = 4

r3 = 5

radii = r1 : r2 : r3 : []

Sum of the areas of n circles?

radii :: [Float]

radii = r1 : r2 : r3 : []

Sum of the areas of n circles?

List

data List a = []

| a : List a

totalArea :: [Float] -> Float

totalArea [] = 0

Sum of the areas of three circles with radii r1, r2, r3

totalArea :: [Float] -> Float

totalArea [] = 0

totalArea (x : xs) =

circleArea x + totalArea xs

Sum of the areas of three circles with radii r1, r2, r3

square :: [Int] -> [Int]square [] = []

square (x : xs) = (x ^ 2) : square xs

Square of list

Map

map :: (a -> b) -> [a] -> [b]

totalArea :: [Float] -> [Float]

totalArea = map circleArea

Sum of the areas of three circles with radii r1, r2, r3

totalArea :: [Float] -> FloattotalArea = sum . map circleArea

Sum of the areas of three circles with radii r1, r2, r3

Currying

simple :: (Int -> Int -> Int) -> Int

simple (x y z)

Currying

simple :: Int -> Int -> Int -> Intsimple x y z = x * ( y + z)

(((simple x) y) z)

Currying

simple 5

Partial Application

simple 5 :: Int -> Int -> Int

simple 5

Partial Application

simple :: Int -> Int -> Int -> Int

simple 5 :: Int -> Int -> Int

simple 5 2 :: Int -> Int

simple 5 2 3 :: Int

Partial Application

Point free programming

Tacit programming (point-free programming) is a programming paradigm in which a function definition does not include information regarding its arguments, using combinators and function composition [...] instead of variables.

Point free programming

map (\x -> increment x) [2,3,4]

[3,4,5]

map increment [2,3,4]

[3,4,5]

map (\x -> x + 1) [2,3,4]

[3,4,5]

map (+1) [2,3,4]

[3,4,5]

increment :: Int -> Int

increment x = x + 1

Point free programming

mf criteria operator list = filter criteria (map operator list)

mf = (. map) . (.) . filter

Functors

Functors

map :: (a -> b) -> [a] -> [b]

data List a = []

| a : List a

Functors

treeMap :: (a -> b) -> Tree a -> Tree b

data Tree a = Leaf a | Branch (Tree a) (Tree a)

Functors

treeMap :: (a -> b) -> Tree a -> Tree b

map :: (a -> b) -> [a] -> [b]

Functors

thingMap :: (a -> b) -> f a -> f b

Functors

A typeclass is a class of types that behave similarly.

Functors

class Functor f where

fmap :: (a -> b) -> f a -> f b

Functors

instance Functor [] where fmap = map

Functors / Maybe

data Maybe a = Just a | Nothing

Functors

instance Functor Maybe where fmap _ Nothing = Nothing fmap f (Just a) = Just (f a)

Functors / Maybefmap (* 2) (Just 2)

Just 4

fmap (+ 5) (Just 2)

Just 7

fmap (+ 5) (Nothing)

Nothing

The End

@volothamp

It’s not about the destination. It’s about the journey.