22.08.2013 Views

f2.pdf

f2.pdf

f2.pdf

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Senaste:<br />

• Allmänt om kursen<br />

• Paradigmer<br />

• Motivation<br />

Idag:<br />

• Intro till Haskell<br />

• Hutton till sid 1–33, 43–47


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionell programmering<br />

Generella egenskaper<br />

Variabler<br />

Tilldelning<br />

Sidoeffekter<br />

Pekare, referenser<br />

Garbage collection


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionell programmering<br />

Generella egenskaper<br />

Variabler Nej!<br />

Tilldelning<br />

Sidoeffekter<br />

Pekare, referenser<br />

Garbage collection


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionell programmering<br />

Generella egenskaper<br />

Variabler Nej!<br />

Tilldelning Nej!<br />

Sidoeffekter<br />

Pekare, referenser<br />

Garbage collection


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionell programmering<br />

Generella egenskaper<br />

Variabler Nej!<br />

Tilldelning Nej!<br />

Sidoeffekter Nej!<br />

Pekare, referenser<br />

Garbage collection


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionell programmering<br />

Generella egenskaper<br />

Variabler Nej!<br />

Tilldelning Nej!<br />

Sidoeffekter Nej!<br />

Pekare, referenser Nej!<br />

Garbage collection


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionell programmering<br />

Generella egenskaper<br />

Variabler Nej!<br />

Tilldelning Nej!<br />

Sidoeffekter Nej!<br />

Pekare, referenser Nej!<br />

Garbage collection Ja!


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionell programmering<br />

• Mindre att skriva


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionell programmering<br />

• Mindre att skriva<br />

• Färre buggar


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionell programmering<br />

• Mindre att skriva<br />

• Färre buggar<br />

• God modulisering


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionell programmering<br />

• Mindre att skriva<br />

• Färre buggar<br />

• God modulisering<br />

• God kodåtervinning


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskell: egenskaper<br />

Strikt funktionellt Inget ”fusk” med tilldelning.


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskell: egenskaper<br />

Strikt funktionellt Inget ”fusk” med tilldelning.<br />

Starkt typsystem Hittar många fel tidigt, stödjer<br />

kodning.


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskell: egenskaper<br />

Strikt funktionellt Inget ”fusk” med tilldelning.<br />

Starkt typsystem Hittar många fel tidigt, stödjer<br />

kodning.<br />

Typklasser Överlagrade funktioner →<br />

kodåtervinning, god abstraktion.


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskell: egenskaper<br />

Strikt funktionellt Inget ”fusk” med tilldelning.<br />

Starkt typsystem Hittar många fel tidigt, stödjer<br />

kodning.<br />

Typklasser Överlagrade funktioner →<br />

kodåtervinning, god abstraktion.<br />

Lat evaluering Beräkna bara det som behövs.


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskell: egenskaper<br />

Strikt funktionellt Inget ”fusk” med tilldelning.<br />

Starkt typsystem Hittar många fel tidigt, stödjer<br />

kodning.<br />

Typklasser Överlagrade funktioner →<br />

kodåtervinning, god abstraktion.<br />

Lat evaluering Beräkna bara det som behövs.<br />

Funktioner är ”first class” Uppmuntrar<br />

abstraktion etc


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskell: egenskaper<br />

Strikt funktionellt Inget ”fusk” med tilldelning.<br />

Starkt typsystem Hittar många fel tidigt, stödjer<br />

kodning.<br />

Typklasser Överlagrade funktioner →<br />

kodåtervinning, god abstraktion.<br />

Lat evaluering Beräkna bara det som behövs.<br />

Funktioner är ”first class” Uppmuntrar<br />

abstraktion etc<br />

Moduler Storskalig programutveckling, goda<br />

bibliotek.


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskellsystem<br />

Hugs98 Etablerat interaktivt interpreterande<br />

system. Används i labbarna.<br />

CSC: module add hugs98, starta<br />

med hugs.<br />

Tips: Använder GNU Readline.


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskellsystem<br />

Hugs98 Etablerat interaktivt interpreterande<br />

system. Används i labbarna.<br />

CSC: module add hugs98, starta<br />

med hugs.<br />

Tips: Använder GNU Readline.<br />

Glasgow Haskell Compiler (GHC) Dels<br />

interaktiv interpretator (ghci), dels<br />

kompilator.<br />

Genererar binärer direkt, via GNU C<br />

eller via C--.<br />

CSC: module add ghc, starts med<br />

ghci, kompilera med ghc.


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskell: grunder<br />

• Kommentarer på en rad med<br />

”minus-minus”: -- Viktig fkn


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskell: grunder<br />

• Kommentarer på en rad med<br />

”minus-minus”: -- Viktig fkn<br />

• Nästlade kommentarer över flera rader:<br />

{- Bla bla -}


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskell: grunder<br />

• Kommentarer på en rad med<br />

”minus-minus”: -- Viktig fkn<br />

• Nästlade kommentarer över flera rader:<br />

{- Bla bla -}<br />

• Namn (parametrar, funktioner) börjar med<br />

gemen. Ex: myAddresses


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskell: grunder<br />

• Kommentarer på en rad med<br />

”minus-minus”: -- Viktig fkn<br />

• Nästlade kommentarer över flera rader:<br />

{- Bla bla -}<br />

• Namn (parametrar, funktioner) börjar med<br />

gemen. Ex: myAddresses<br />

• Värden (symboler) börjar med Versal. Ex:<br />

True


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskell: grunder<br />

• Kommentarer på en rad med<br />

”minus-minus”: -- Viktig fkn<br />

• Nästlade kommentarer över flera rader:<br />

{- Bla bla -}<br />

• Namn (parametrar, funktioner) börjar med<br />

gemen. Ex: myAddresses<br />

• Värden (symboler) börjar med Versal. Ex:<br />

True<br />

• Funktionsanrop utan parantes. Ex: f (x)<br />

skrivs f 3.


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Haskell: grunder<br />

• Kommentarer på en rad med<br />

”minus-minus”: -- Viktig fkn<br />

• Nästlade kommentarer över flera rader:<br />

{- Bla bla -}<br />

• Namn (parametrar, funktioner) börjar med<br />

gemen. Ex: myAddresses<br />

• Värden (symboler) börjar med Versal. Ex:<br />

True<br />

• Funktionsanrop utan parantes. Ex: f (x)<br />

skrivs f 3.<br />

• Funktionsdefinition som i matte. Ex:<br />

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


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Grundläggande typer<br />

Bool True, False<br />

Int 2 31 – 2 31 − 1<br />

Integer Godtyckligt stora<br />

Float 32 bitar<br />

Double 64 bitar<br />

Char ’a’, ’9’, ’\n’<br />

String Lasse"


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Hugs> not True<br />

False<br />

Hugs> True || False<br />

True<br />

Hugs> True && False<br />

False<br />

Operationer


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Hugs> not True<br />

False<br />

Hugs> True || False<br />

True<br />

Hugs> True && False<br />

False<br />

Hugs> 5 < 7<br />

True<br />

Hugs> not (5 < 7)<br />

False<br />

Operationer


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Hugs> not True<br />

False<br />

Hugs> True || False<br />

True<br />

Hugs> True && False<br />

False<br />

Hugs> 5 < 7<br />

True<br />

Hugs> not (5 < 7)<br />

False<br />

Operationer<br />

Hugs> ’a’ == ’a’<br />

True<br />

Hugs> ’a’ == ’b’<br />

False<br />

Hugs> ’a’ /= ’a’<br />

False


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Hugs> not True<br />

False<br />

Hugs> True || False<br />

True<br />

Hugs> True && False<br />

False<br />

Hugs> 5 < 7<br />

True<br />

Hugs> not (5 < 7)<br />

False<br />

Operationer<br />

Hugs> ’a’ == ’a’<br />

True<br />

Hugs> ’a’ == ’b’<br />

False<br />

Hugs> ’a’ /= ’a’<br />

False<br />

Hugs> 1+2*3<br />

7<br />

Hugs> (1+2)*3<br />

9<br />

Hugs> 3^3<br />

27


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Hugs> 42 / 17<br />

2.47058823529412


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Hugs> 42 / 17<br />

2.47058823529412<br />

Hugs> 42 div 17<br />

ERROR - Cannot infer instance<br />

*** Instance : Num ((a -> a -> a) -><br />

*** Expression : fromInt 42 div 17


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Hugs> 42 / 17<br />

2.47058823529412<br />

Hugs> 42 div 17<br />

ERROR - Cannot infer instance<br />

*** Instance : Num ((a -> a -> a) -><br />

*** Expression : fromInt 42 div 17<br />

Hugs> div 42 17<br />

2


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Hugs> 42 / 17<br />

2.47058823529412<br />

Hugs> 42 div 17<br />

ERROR - Cannot infer instance<br />

*** Instance : Num ((a -> a -> a) -><br />

*** Expression : fromInt 42 div 17<br />

Hugs> div 42 17<br />

2<br />

Hugs> 42 ‘div‘ 17<br />

2


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Hugs> 42 / 17<br />

2.47058823529412<br />

Hugs> 42 div 17<br />

ERROR - Cannot infer instance<br />

*** Instance : Num ((a -> a -> a) -><br />

*** Expression : fromInt 42 div 17<br />

Hugs> div 42 17<br />

2<br />

Hugs> 42 ‘div‘ 17<br />

2<br />

Hugs> mod 9 2 + 10 ‘mod‘ 3<br />

2


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Tupler:<br />

(1,2)<br />

(’A’, True)<br />

Tupler<br />

(17, "Lasse", False, False, (1, 2))<br />

Enda kravet: Minst två element.


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Tupler:<br />

(1,2)<br />

(’A’, True)<br />

Tupler<br />

(17, "Lasse", False, False, (1, 2))<br />

Enda kravet: Minst två element.<br />

Funktioner: Hugs> fst (1, 2)<br />

1<br />

Hugs> snd (1, 2)<br />

2


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Listor<br />

[1, 2, 3, 4, 5, 6, 7]<br />

["Lasse", "Arvestad"]<br />

[]


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Listor<br />

[1, 2, 3, 4, 5, 6, 7]<br />

["Lasse", "Arvestad"]<br />

[]<br />

Cons-operatorn : konstruerar par, kedjade par<br />

ger listor:<br />

(1 : (2 : (3 : (4 : []))))


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Listor<br />

[1, 2, 3, 4, 5, 6, 7]<br />

["Lasse", "Arvestad"]<br />

[]<br />

Cons-operatorn : konstruerar par, kedjade par<br />

ger listor:<br />

(1 : (2 : (3 : (4 : []))))


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Listor<br />

[1, 2, 3, 4, 5, 6, 7]<br />

["Lasse", "Arvestad"]<br />

[]<br />

Cons-operatorn : konstruerar par, kedjade par<br />

ger listor:<br />

(1 : (2 : (3 : (4 : []))))


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Listor<br />

[1, 2, 3, 4, 5, 6, 7]<br />

["Lasse", "Arvestad"]<br />

[]<br />

Cons-operatorn : konstruerar par, kedjade par<br />

ger listor:<br />

(1 : (2 : (3 : (4 : [])))) = [1, 2, 3, 4]


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Listor<br />

[1, 2, 3, 4, 5, 6, 7]<br />

["Lasse", "Arvestad"]<br />

[]<br />

Cons-operatorn : konstruerar par, kedjade par<br />

ger listor:<br />

(1 : (2 : (3 : (4 : [])))) = [1, 2, 3, 4]<br />

= 1 : 2 : 3 : 4 : []


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktioner på listor<br />

Hugs> null [1,2,3]<br />

False<br />

Hugs> null []<br />

True<br />

Hugs> head [1,2,3]<br />

1<br />

Hugs> tail [1,2,3]<br />

[2,3]<br />

Hugs><br />

Se också Appendix B.6 i Hutton!


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Strängar är listor<br />

Hugs> ’L’ : ’a’ : ’s’ : ’s’ : ’e’ : []<br />

"Lasse"<br />

Hugs> head "Lasse’’<br />

’L’<br />

Hugs> "Lars" ++ "Arvestad"<br />

"LarsArvestad"<br />

Hugs> length ("Lars"++"Arvestad")<br />

12


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionstyper<br />

Exempel: logiskt icke är en funktion<br />

icke : {True, False} → {True, False}.


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionstyper<br />

Exempel: logiskt icke är en funktion<br />

I Haskell:<br />

icke : {True, False} → {True, False}.<br />

Hugs> :t not<br />

not :: Bool -> Bool


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionstyper<br />

Exempel: logiskt icke är en funktion<br />

I Haskell:<br />

icke : {True, False} → {True, False}.<br />

Hugs> :t not<br />

not :: Bool -> Bool<br />

Funktion som testar om en bokstav är en siffra:<br />

isDigit c = c >= ’0’ && c


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Funktionstyper<br />

Exempel: logiskt icke är en funktion<br />

I Haskell:<br />

icke : {True, False} → {True, False}.<br />

Hugs> :t not<br />

not :: Bool -> Bool<br />

Funktion som testar om en bokstav är en siffra:<br />

isDigit :: Char -> Bool<br />

isDigit c = c >= ’0’ && c


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Förenkla med where<br />

Herons formel:<br />

Arean A för en triangel med sidorna a, b, c är<br />

A = p(p − a)(p − b)(p − c) där<br />

p = (a + b + c)/2.


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Förenkla med where<br />

Herons formel:<br />

Arean A för en triangel med sidorna a, b, c är<br />

A = p(p − a)(p − b)(p − c) där<br />

p = (a + b + c)/2.<br />

I Haskell:<br />

area a, b, c = sqrt (p*(p-a)(p-b)(p-c))<br />

where p = (a + b + c) / 2


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Uttrycket<br />

Förenkla med let<br />

area a, b, c = sqrt (p*(p-a)(p-b)(p-c))<br />

where p = (a + b + c) / 2<br />

Kan ersättas med<br />

area a, b, c = let p = (a + b + c) / 2<br />

in sqrt (p*(p-a)(p-b)(p-c))


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Mer notation: layout-regeln<br />

”Syskon-uttryck” står under varandra<br />

f a b c = a + d + e<br />

where d = b^3<br />

e = c^4


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Alternering med if<br />

myDigit c = if c >= ’0’ && c


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Alternering med if<br />

myDigit c = if c >= ’0’ && c


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Alternering med if<br />

myDigit c = if c >= ’0’ && c


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Alternering med if<br />

myDigit c = if c >= ’0’ && c


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Alternering med if<br />

myDigit c = if c >= ’0’ && c


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Alternering med vakter<br />

I matematik:<br />

abs(x) =<br />

<br />

x<br />

−x<br />

om x ≥ 0<br />

annars


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Alternering med vakter<br />

I matematik:<br />

abs(x) =<br />

<br />

x<br />

−x<br />

om x ≥ 0<br />

annars<br />

I Haskell:<br />

abs x | x >= 0 = x<br />

| otherwise = -x<br />

Eng: guarded expression.


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Istället för<br />

Mönsterpassning<br />

icke b = if b == True<br />

then False<br />

else True<br />

skriv<br />

icke True = False<br />

icke False = True


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Mönsterpassning på listor<br />

Huvudet på en lista:<br />

head [] = error "No head on an empty li<br />

head (e : restOfList) = e


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Mönsterpassning på listor<br />

Huvudet på en lista:<br />

head [] = error "No head on an empty li<br />

head (e : restOfList) = e<br />

eller:<br />

head [] = error "No head on an empty li<br />

head (e : _ ) = e


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Mönsterpassning på listor<br />

Räkna blanka i en sträng:<br />

countSpaces :: String -> Int<br />

countSpaces [] = 0<br />

countSpaces (c : restOfString)<br />

= let d = if c == ’ ’ then 1<br />

else 0<br />

in d + countSpaces restOfString


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

Mönsterpassning på listor<br />

Räkna blanka i en sträng:<br />

countSpaces :: String -> Int<br />

countSpaces [] = 0<br />

countSpaces (c : restOfString)<br />

= let d = if c == ’ ’ then 1<br />

else 0<br />

in d + countSpaces restOfString<br />

eller:<br />

countSpaces :: String -> Int<br />

countSpaces [] = 0<br />

countSpaces (’ ’ : restOfString)<br />

= 1 + countSpaces restOfString<br />

countSpaces (_ : restOfString)<br />

= 0 + countSpaces restOfString


Intro Typer Tupler och listor Funktioner Flödeskontroll<br />

• Mer om rekursion<br />

• Ackumulering<br />

• Polymorfism<br />

• Typklasser<br />

• Typkonvertering<br />

• Currying<br />

Härnäst

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!