f2.pdf
f2.pdf
f2.pdf
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