Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud...

51
Introduction Real World Haskell Going further Haskell: an introduction Sylvain HENRY [email protected] University of Bordeaux - LaBRI - Inria February 5th, 2013 Haskell: an introduction 1 / 34 University of Bordeaux - LaBRI - Inria

Transcript of Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud...

Page 1: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Haskell: an introduction

Sylvain [email protected]

University of Bordeaux - LaBRI - Inria

February 5th, 2013

Haskell: an introduction 1 / 34 University of Bordeaux - LaBRI - Inria

Page 2: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Outline

Introduction

Real World Haskell

Going further

Haskell: an introduction 2 / 34 University of Bordeaux - LaBRI - Inria

Page 3: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Outline

Introduction

Real World Haskell

Going further

Haskell: an introduction 3 / 34 University of Bordeaux - LaBRI - Inria

Page 4: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Haskell: an introduction 4 / 34 University of Bordeaux - LaBRI - Inria

Page 5: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Haskell

1. purely functional programming language

2. lazily evaluated

3. statically typed

4. elegant and concise

Haskell: an introduction 5 / 34 University of Bordeaux - LaBRI - Inria

Page 6: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Functional: functions

f : x 7→ 10 + x h = f ◦ gg : x 7→ x× 2 r = h(10)

f x = 10 + xg x = x ∗ 2h = f . gr = h 10

k : (x, y) 7→ x + yr2 = k(10, 20)

k x y = x + yr2 = k 10 20f = k 10 −− c u r r y i n g

Haskell: an introduction 6 / 34 University of Bordeaux - LaBRI - Inria

Page 7: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Functional: higher-order functions

g f x = ( f x ) ∗ ( f ( f x ) )

s q u a r e x = x ˆ 2

r = g s q u a r e 2 −− r = 64

r = g (\ x → x∗2 + x ˆ2) 2 −− r = 640

r = map (∗ 2) [ 1 , 2 , 3 ] −− r = [ 2 , 4 , 6 ]

Haskell: an introduction 7 / 34 University of Bordeaux - LaBRI - Inria

Page 8: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Functional: pattern-matching

−− L i s t s a r e ”cons− l i s t s ”[ 1 , 2 , 3 ] == 1 : [ 2 , 3 ]

== 1 : 2 : [ 3 ]== 1 : 2 : 3 : [ ]

length l i s t = case l i s t of[ ] → 0x : xs → 1 + ( length xs )

length [ ] = 0length ( x : xs ) = 1 + ( length xs )

Haskell: an introduction 8 / 34 University of Bordeaux - LaBRI - Inria

Page 9: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Purely functional

PropertiesI Immutable variables

I if a = 5, it is true for the entire scope

I Referential transparencyI f x always returns the same result for given f and x

I No side effectI IO...

Very good properties to

I reason about programs (program transformations, proofs. . . )

I compose functions together to write complex programs

Haskell: an introduction 9 / 34 University of Bordeaux - LaBRI - Inria

Page 10: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Purely functional

PropertiesI Immutable variables

I if a = 5, it is true for the entire scope

I Referential transparencyI f x always returns the same result for given f and x

I No side effectI IO...

Very good properties to

I reason about programs (program transformations, proofs. . . )

I compose functions together to write complex programs

Haskell: an introduction 9 / 34 University of Bordeaux - LaBRI - Inria

Page 11: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Purely functional

PropertiesI Immutable variables

I if a = 5, it is true for the entire scope

I Referential transparencyI f x always returns the same result for given f and x

I No side effectI IO...

Very good properties to

I reason about programs (program transformations, proofs. . . )

I compose functions together to write complex programs

Haskell: an introduction 9 / 34 University of Bordeaux - LaBRI - Inria

Page 12: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Purely functional

PropertiesI Immutable variables

I if a = 5, it is true for the entire scope

I Referential transparencyI f x always returns the same result for given f and x

I No side effectI IO...

Very good properties to

I reason about programs (program transformations, proofs. . . )

I compose functions together to write complex programs

Haskell: an introduction 9 / 34 University of Bordeaux - LaBRI - Inria

Page 13: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Purely functional

PropertiesI Immutable variables

I if a = 5, it is true for the entire scope

I Referential transparencyI f x always returns the same result for given f and x

I No side effectI IO...

Very good properties to

I reason about programs (program transformations, proofs. . . )

I compose functions together to write complex programs

Haskell: an introduction 9 / 34 University of Bordeaux - LaBRI - Inria

Page 14: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Purely functional: what to compute vs how

e.g. ‖x‖ =√

x21 + · · ·+ x2n

double norm ( i n t n , double ∗ xs ) { // Cdouble s = 0 . 0 ;f o r ( i n t i =0; i<n ; i ++)

s += xs [ i ] ∗ xs [ i ] ;return s q r t ( s ) ;

}

norm = sqr t . sum . map ( ˆ 2 ) −− Ha s k e l l

Haskell: an introduction 10 / 34 University of Bordeaux - LaBRI - Inria

Page 15: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Lazily evaluated

Only compute what is needed to produce the result, nothing more

d o u b l e s = map (∗ 2) [ 1 , 2 , 3 , 4 , 5 ]

r = d o u b l e s ! ! 1 −− i ndexed a c c e s s ( r = 4)

−− 2 , 6 , 8 and 10 a r e NOT computed

Haskell: an introduction 11 / 34 University of Bordeaux - LaBRI - Inria

Page 16: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Lazily evaluated: infinite data!

d o u b l e s = map (∗ 2) [ 1 , 2 . . ]

r = d o u b l e s ! ! 15 −− r = 32

r = length d o u b l e s −− ! ! ! i n f i n i t e ”l oop ”

Haskell: an introduction 12 / 34 University of Bordeaux - LaBRI - Inria

Page 17: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Lazily evaluated: infinite data!

Fibonacci number:

f i b s = [ 0 , 1 ] ++ zipWith (+) f i b s ( t a i l f i b s )

r = f i b s ! ! 15 −− r = 610

fibs = [0, 1, 1, 2, 3, 5, 8...]tail fibs = [1, 1, 2, 3, 5, 8, 13...]

zipWith (+) fibs (tail fibs) = [1, 2, 3, 5, 8, 13, 21...]

Haskell: an introduction 13 / 34 University of Bordeaux - LaBRI - Inria

Page 18: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Lazily evaluated: infinite data!

Fibonacci number:

f i b s = [ 0 , 1 ] ++ zipWith (+) f i b s ( t a i l f i b s )

r = f i b s ! ! 15 −− r = 610

fibs = [0, 1, 1, 2, 3, 5, 8...]tail fibs = [1, 1, 2, 3, 5, 8, 13...]

zipWith (+) fibs (tail fibs) = [1, 2, 3, 5, 8, 13, 21...]

Haskell: an introduction 13 / 34 University of Bordeaux - LaBRI - Inria

Page 19: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Lazily evaluated: infinite data!

Fibonacci number:

f i b s = [ 0 , 1 ] ++ zipWith (+) f i b s ( t a i l f i b s )

r = f i b s ! ! 15 −− r = 610

fibs = [0, 1, 1, 2, 3, 5, 8...]tail fibs = [1, 1, 2, 3, 5, 8, 13...]

zipWith (+) fibs (tail fibs) = [1, 2, 3, 5, 8, 13, 21...]

Haskell: an introduction 13 / 34 University of Bordeaux - LaBRI - Inria

Page 20: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Lazily evaluated: infinite data!

Fibonacci number:

f i b s = [ 0 , 1 ] ++ zipWith (+) f i b s ( t a i l f i b s )

r = f i b s ! ! 15 −− r = 610

fibs = [0, 1, 1, 2, 3, 5, 8...]tail fibs = [1, 1, 2, 3, 5, 8, 13...]

zipWith (+) fibs (tail fibs) = [1, 2, 3, 5, 8, 13, 21...]

Haskell: an introduction 13 / 34 University of Bordeaux - LaBRI - Inria

Page 21: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Lazily evaluated: infinite data!

Fibonacci number:

f i b s = [ 0 , 1 ] ++ zipWith (+) f i b s ( t a i l f i b s )

r = f i b s ! ! 15 −− r = 610

fibs = [0, 1, 1, 2, 3, 5, 8...]tail fibs = [1, 1, 2, 3, 5, 8, 13...]

zipWith (+) fibs (tail fibs) = [1, 2, 3, 5, 8, 13, 21...]

Haskell: an introduction 13 / 34 University of Bordeaux - LaBRI - Inria

Page 22: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Statically typed: type inference

Strong type checking at compile time

ghc i> l e t d o u b l e s = map (∗ 2) [ 1 , 2 . . ]ghc i> d o u b l e s ! ! 1532

ghc i> : type d o u b l e sd o u b l e s : : [ Integer ]

ghc i> : type ( d o u b l e s ! ! )( d o u b l e s ! ! ) : : Int → Integer

I ghci is the REPL (Read-Eval-Print-Loop) of GHC

I Very useful to quickly test and check!

Haskell: an introduction 14 / 34 University of Bordeaux - LaBRI - Inria

Page 23: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Type checking

ghc i> "Test" + 10

No instance f o r (Num Str ing ) a r i s i n g froma use of ‘+ ’

P o s s i b l e f i x : add an instance d e c l a r a t i o nf o r (Num Str ing )

I n the e x p r e s s i o n : "Test" + 10

I Ok it works

Haskell: an introduction 15 / 34 University of Bordeaux - LaBRI - Inria

Page 24: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Elegant and Concise

−− HsCat . hsmain = i n t e r ac t id

−− HsLineCount . hsmain = i n t e r ac t ( p r i n t f "%d" . length . l i n e s )

I Compile with ”ghc XXX.hs”

$ . / HsCat < b e t t e r a v e s . t x tP i fPafPouf$ . / HsLineCount < b e t t e r a v e s . t x t3

Haskell: an introduction 16 / 34 University of Bordeaux - LaBRI - Inria

Page 25: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Outline

Introduction

Real World Haskell

Going further

Haskell: an introduction 17 / 34 University of Bordeaux - LaBRI - Inria

Page 26: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Real World Haskell

I Not only a calculator languageI You can have

I IO (files, GUI, networking. . . )I Random numbersI ThreadsI Bindings to C librariesI . . .

I ExamplesI xmonad (tiling X window manager)I ghc (Haskell compiler)I darcs (git-like version control system)I . . .

Haskell: an introduction 18 / 34 University of Bordeaux - LaBRI - Inria

Page 27: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Haskell: an introduction 19 / 34 University of Bordeaux - LaBRI - Inria

Page 28: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: first try

getLine : : Str ing −− r ead a l i n e on s t d i nputStrLn : : Str ing → ( ) −− w r i t e a l i n e on s tdou t

main =l e t lastName = getLine in

l e t f i r s t N a m e = getLine inputStrLn ("Hi" ++ f i r s t N a m e ++ lastName )

I Haskell is referentially transparentI lastName = getLine = firstName

I Haskell is lazily evaluatedI Is firstName or lastName evaluated first?I What if we never use firstName or lastName?I putStrLn does not return a result and will never be evaluated

Haskell: an introduction 20 / 34 University of Bordeaux - LaBRI - Inria

Page 29: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: first try

getLine : : Str ing −− r ead a l i n e on s t d i nputStrLn : : Str ing → ( ) −− w r i t e a l i n e on s tdou t

main =l e t lastName = getLine in

l e t f i r s t N a m e = getLine inputStrLn ("Hi" ++ f i r s t N a m e ++ lastName )

I Haskell is referentially transparentI lastName = getLine = firstName

I Haskell is lazily evaluatedI Is firstName or lastName evaluated first?I What if we never use firstName or lastName?I putStrLn does not return a result and will never be evaluated

Haskell: an introduction 20 / 34 University of Bordeaux - LaBRI - Inria

Page 30: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: first try

getLine : : Str ing −− r ead a l i n e on s t d i nputStrLn : : Str ing → ( ) −− w r i t e a l i n e on s tdou t

main =l e t lastName = getLine in

l e t f i r s t N a m e = getLine inputStrLn ("Hi" ++ f i r s t N a m e ++ lastName )

I Haskell is referentially transparentI lastName = getLine = firstName

I Haskell is lazily evaluatedI Is firstName or lastName evaluated first?I What if we never use firstName or lastName?I putStrLn does not return a result and will never be evaluated

Haskell: an introduction 20 / 34 University of Bordeaux - LaBRI - Inria

Page 31: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: back to basics

Enter your name:>

Enter your name:> Dave Weckl ↲

Haskell: an introduction 21 / 34 University of Bordeaux - LaBRI - Inria

Page 32: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: back to basics

Enter your name:>

Enter your name:> Dave Weckl ↲

getLine

Haskell: an introduction 21 / 34 University of Bordeaux - LaBRI - Inria

Page 33: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: back to basics

Enter your name:>

Enter your name:> Dave Weckl ↲

"Dave Weckl"

getLine

Haskell: an introduction 21 / 34 University of Bordeaux - LaBRI - Inria

Page 34: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: back to basics

Enter your name:>

Enter your name:> Dave Weckl ↲

"Dave Weckl"

getLine

getLine :: World →(World, String)

Haskell: an introduction 21 / 34 University of Bordeaux - LaBRI - Inria

Page 35: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: back to basics

Enter your name:> Dave Weckl ↲

Enter your name:> Dave Weckl ↲Hi Dave Weckl

"Hi Dave Weckl"

putStrLn

Haskell: an introduction 21 / 34 University of Bordeaux - LaBRI - Inria

Page 36: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: back to basics

Enter your name:> Dave Weckl ↲

Enter your name:> Dave Weckl ↲Hi Dave Weckl

"Hi Dave Weckl"

putStrLn

putStrLn :: String →World →(World, ())

Haskell: an introduction 21 / 34 University of Bordeaux - LaBRI - Inria

Page 37: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: explicit ”world” variables

getLine : : World → ( World , Str ing )putStrLn : : Str ing → World → ( World , ( ) )

>

initWorld

"Steve"

> Steve ↲getLine

world 1

"Gadd"

> Steve ↲> Gadd ↲

getLine

world 2

"Hi Steve Gadd"

> Steve ↲> Gadd ↲Hi Steve Gadd

putStrLn

world 3

main : : World → ( World , ( ) )main i n i t W o r l d =l e t ( wor ld1 , f i ) = getLine i n i t W o r l d i nl e t ( wor ld2 , l a ) = getLine wor ld1 i nputStrLn ( p r i n t f "Hi %s %s" f i l a ) wor ld2

Haskell: an introduction 22 / 34 University of Bordeaux - LaBRI - Inria

Page 38: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Issue: what if a ”world” variable is used several times?

> > Steve ↲

"Steve"

getLine

Enter your name:>

> Gadd ↲

"Gadd"

getLine

initWorld world 1

world 2

main i n i tWo r l d =l e t (w1 , f i ) = getL ine i n i tWo r l d i nl e t (w2 , l a ) = getL ine i n i tWo r l d i nputStrLn ( p r i n t f "Hi %s %s" f i l a ) w2

Two solutions (at least)

I Check that it is not the case (Clean’s uniqueness types)

I No explicit ”world” variables: provide composition operatorsinstead (Haskell’s monadic IO)

Haskell: an introduction 23 / 34 University of Bordeaux - LaBRI - Inria

Page 39: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Issue: what if a ”world” variable is used several times?

> > Steve ↲

"Steve"

getLine

Enter your name:>

> Gadd ↲

"Gadd"

getLine

initWorld world 1

world 2

main i n i tWo r l d =l e t (w1 , f i ) = getL ine i n i tWo r l d i nl e t (w2 , l a ) = getL ine i n i tWo r l d i nputStrLn ( p r i n t f "Hi %s %s" f i l a ) w2

Two solutions (at least)

I Check that it is not the case (Clean’s uniqueness types)

I No explicit ”world” variables: provide composition operatorsinstead (Haskell’s monadic IO)

Haskell: an introduction 23 / 34 University of Bordeaux - LaBRI - Inria

Page 40: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Issue: what if a ”world” variable is used several times?

> > Steve ↲

"Steve"

getLine

Enter your name:>

> Gadd ↲

"Gadd"

getLine

initWorld world 1

world 2

main i n i tWo r l d =l e t (w1 , f i ) = getL ine i n i tWo r l d i nl e t (w2 , l a ) = getL ine i n i tWo r l d i nputStrLn ( p r i n t f "Hi %s %s" f i l a ) w2

Two solutions (at least)

I Check that it is not the case (Clean’s uniqueness types)

I No explicit ”world” variables: provide composition operatorsinstead (Haskell’s monadic IO)

Haskell: an introduction 23 / 34 University of Bordeaux - LaBRI - Inria

Page 41: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: composition operators

type W = World

−− Compos i t ion which u s e s r e t r i e v e d v a l u e(>>=) : : (W→ (W, a ) ) → ( a →W→ (W, b ) ) → (W→ (W, b ) )

main = getL ine >>= putStrLn= getL ine >>= (\ i n pu t → putStrLn i n pu t )

−− Compos i t ion l i k e imp e r a t i v e ”; ”(>>) : : (W→ (W, a ) ) → (W→ (W, b ) ) → (W→ (W, b ) )

main = putStrLn "Hello" >> putStrLn "World"

= putStrLn "Hello" >>= (\dummy → putStrLn "World" )

−− L i f t pure v a l u er e t u r n : : a →W→ (W, a )

main = r e t u r n "Ho" >>= (\ s → putStrLn s >> putStrLn s )

Haskell: an introduction 24 / 34 University of Bordeaux - LaBRI - Inria

Page 42: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: composition operators sugarized

type IO a = World → (World , a )

−− Compos i t ion which u s e s r e t r i e v e d v a l u e(>>=) : : IO a → ( a → IO b ) → IO b

main = getL ine >>= putStrLn= getL ine >>= (\ i n pu t → putStrLn i n pu t )

−− Compos i t ion l i k e imp e r a t i v e ”; ”(>>) : : IO a → IO b → IO b

main = putStrLn "Hello" >> putStrLn "World"

= putStrLn "Hello" >>= (\dummy → putStrLn "World" )

−− L i f t pure v a l u er e t u r n : : a → IO a

main = r e t u r n "Ho" >>= (\ s → putStrLn s >> putStrLn s )

Haskell: an introduction 25 / 34 University of Bordeaux - LaBRI - Inria

Page 43: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: working example using composition operators

main : : IO ( )main =

putStrLn "First name:" >>getLine >>= \ f i r s t n a m e →

putStrLn "Last name:" >>getLine >>= \ l a s t n a m e →

return ( h i f i r s t n a m e l a s t n a m e ) >>= \ s →putStrLn s

h i : : Str ing → Str ing → Str ingh i f i l a = p r i n t f "Hello %s %s" f i l a

Haskell: an introduction 26 / 34 University of Bordeaux - LaBRI - Inria

Page 44: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

IO: working example using do-notation

main : : IO ( )main = do

putStrLn "First name:"

f i r s t n a m e ← getLineputStrLn "Last name:"

l a s t n a m e ← getLinel e t s = h i f i r s t n a m e l a s t n a m eputStrLn s

h i : : Str ing → Str ing → Str ingh i f i l a = p r i n t f "Hello %s %s" f i l a

Haskell: an introduction 27 / 34 University of Bordeaux - LaBRI - Inria

Page 45: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Simon L. Peyton Jones and Philip Wadler.

Imperative functional programming.In Proceedings of the 20th ACM SIGPLAN-SIGACT symposium on Principles of programming languages,POPL ’93, pages 71–84, New York, NY, USA, 1993. ACM.

Haskell: an introduction 28 / 34 University of Bordeaux - LaBRI - Inria

Page 46: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Outline

Introduction

Real World Haskell

Going further

Haskell: an introduction 29 / 34 University of Bordeaux - LaBRI - Inria

Page 47: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Haskell: an introduction 30 / 34 University of Bordeaux - LaBRI - Inria

Page 48: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Haskell Awesomeness 1/2

I List-Comprehensions:I e.g. r = {x + y , x ∈ xs, y ∈ ys, x ≥ 10, y > x}

r = [ x + y | x ← xs , y ← ys , x >= 10 , y > x ]

I QuickCheck

> qu ickCheck ( (\ s → r e v e r s e s == s ) : : S t r i n g → Bool )∗∗∗ F a i l e d ! F a l s i f i a b l e ( a f t e r 3 t e s t s and 2 s h r i n k s ) :"ab"

> qu ickCheck ( (\ s → ( r e v e r s e ( r e v e r s e s ) == s ) : : S t r i n g →Bool )

+++ OK, pas sed 100 t e s t s .

Haskell: an introduction 31 / 34 University of Bordeaux - LaBRI - Inria

Page 49: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Haskell Awesomeness 2/2

I Parallelism

a ← async ( f x y )b ← async ( g w t )r ← waitAny [ a , b ]

I Software Transactional Memory (STM)

t r a n s f e r n account1 account2 = a t o m i c a l l y $ dox ← readTVar account1when ( x < n ) r e t r ywr i teTVar account1 ( x − n )y ← readTVar account2wr i teTVar account2 ( y + n )

Haskell: an introduction 32 / 34 University of Bordeaux - LaBRI - Inria

Page 50: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Haskell Awesomeness 3/2

I Haskell languageI Committee drivenI Fully specified

I Glasgow Haskell Compiler (GHC)I BSD licenseI Actively developedI Generate native code

I Optional LLVM backendI C bindings easy to write and use

I Optimizing compilerI hlint: ”checkstyle”-like for Haskell

I CommunityI #haskell, mailing-lists, wiki, papersI Hackage: 4500+ packages

Haskell: an introduction 33 / 34 University of Bordeaux - LaBRI - Inria

Page 51: Sylvain HENRY sylvain.henry@inria - Inria Bordeaux Sud ...sed.bordeaux.inria.fr/seminars/haskell_20130205.pdf · > Dave Weckl Hi Dave Weckl "Hi Dave Weckl" putStrLn putStrLn :: String

Introduction Real World Haskell Going further

Questions?

Haskell: an introduction 34 / 34 University of Bordeaux - LaBRI - Inria