280 likes | 528 Views
Imperatief programmeren. Programma bestaat uit Runnen is. opdrachten gegroepeerd in methoden. één voor één uitvoeren te beginnen met main. Functioneel programmeren. Programma bestaat uit Runnen is. functie-definities. uitrekenen van een expressie. Logisch programmeren.
E N D
Imperatief programmeren • Programma bestaat uit • Runnen is opdrachten gegroepeerd in methoden één voor één uitvoeren te beginnen met main
Functioneel programmeren • Programma bestaat uit • Runnen is functie-definities uitrekenen van eenexpressie
Logisch programmeren • Programma bestaat uit • Runnen is predicaat-definities proberen te vervullenvan een predicaat
kwad x = x * x Haskell Functie-definitie static int kwad (int x) { return x*x ;} kwad :: Int Int
main = kwad 5 Haskell Gebruik van de functie public static void main(String [ ] ps) { System.out.println( this.kwad(5) ); } main :: Int
Functies definiëren • Door combinatie van standaardfuncties fac :: Int Int fac n = product [1..n] oneven :: Int Bool oneven n = not (even n) negatief :: Int Bool negatief n = n < 0
Prelude: operatoren op lijsten • “op kop van” • “samenvoegen” : > 1 : [2, 3, 4] [1, 2, 3, 4] ++ > [1, 2] ++ [3, 4, 5] [1, 2, 3, 4, 5]
Prelude: functies op lijsten null • “leeg?” • “allemaal waar?” • “neem deel” > null [ ] True and > and [ 1<2, 2<3, 1==0] False take > take 3 [2..10] [2, 3, 4]
Functies als parameter • Pas functie toe op alleelementen van een lijst map > map fac [1, 2, 3, 4, 5] [1, 2, 6, 24, 120] > map sqrt [1.0, 2.0, 3.0, 4.0] [1.0, 1.41421, 1.73205, 2.0] > map even [1 .. 6] [False, True, False, True, False, True]
Gevallen onderscheiden abs :: Int Int abs x | x>=0 | x<0 = x = -x “guards”
Herhalen fac :: Int Int fac n | n==0 | n>0 = 1 = fac (n-1) n * graag zonder product te gebruiken “recursie”
Lijst-patronen null :: [Int] Bool null [ ] = Truenull (x:xs) = False head :: [Int] Int head (x:xs) = x tail :: [Int] [Int] head (x:xs) = xs
Zelftest sum • Definieer de recursieve functie • met patronen • met gevalsonderscheid d.m.v. guards sum :: [Int] Int sum [ ] = 0 sum (x:xs) = x + sum xs sum :: [Int] Int sum xs | null xs = 0 | True = head xs + sum (tail xs)
Quiz (basisschool) 5 + 3 * 2 prioriteitsregel 16 11 3 * 2 5 + 3 + 2 associatief 10 10 5 - 3 - 2 links-associatief 5 - 3 0 4 5 ^ 3 ^ 2 rechts-associatief 3 ^ 2 1252 59 machtsverheffen
Quiz (logica) F T F associatief F F F T F associatief T T F T F rechts-associatief T F F T implicatie
Quiz (Haskell) los element op kop van lijst x : y : z rechts-associatief y : zs x ++ y ++ z associatief lijsten samenvoegen
Quiz (Helium) toepassen van een functie map fac [1,2,3] f y z map fac links-associatief boven n k links-associatief boven n
Partieel parametriseren plus :: Int Int Int plus x y = x + y • Stel: • En dan: drieMeer :: Int Int drieMeer = plus 3 > map drieMeer [1, 2, 3, 4, 5] [4, 5, 6, 7, 8]
Partieel parametriseren drieMeer = plus 3 drieMeer :: Int Int • Omgekeerd: • En dus: plus :: Int (Int Int) plus :: Int Int Int rechts-associatief
zonder haakjes! “Curry-ing” f :: Int Bool String • Type • Aanroep Bool String > f 7 True “hoi” f 7 rechts-associatief links-associatief
Currying Schönfinkeling? • Haskell B. Curry(1900-1982) • Grundlagen der kombinatorischen Logik (1930) • M. Schönfinkel Über die Bausteine der mathematischen Logik (1924)
Currying en map > map fac [1, 2, 3, 4, 5] [1, 2, 6, 24, 120] > map (plus 3) [1, 2, 3, 4, 5] [4, 5, 6, 7, 8] > map (* 2) [1, 2, 3, 4, 5] [2, 4, 6, 8, 10]
Hogere-ordefuncties • Functie met een functieals parameter • Functie met een functieals resultaat map filter inverse afgeleide elke functie met >1 parameter!
Hogere-ordefuncties • Een lijst langs lopenen met elk element iets doen • Een lijst langs lopenen sommige elementen selecteren map filter
map en filter doe dit overal > map even [1, 2, 3, 4, 5, 6] [False, True, False, True, False, True] > filter even [1, 2, 3, 4, 5, 6] [2, 4, 6] pak alleen deze
Publieksvraag kleintjes • Schrijf een functiedie getallen van een lijst oplevertdie kleiner zijn dan 10 kleintjes :: [Int] [Int] kleintjes xs = filter (<10) xs ook partieel geparametriseerd!
Definitie van map • Geef een recursieve definitie: map :: (ab) [a] [b] [ ] map f [ ] =map f (x:xs) = f x : map f xs
Definitie van filter • Geef een recursieve definitie,en gebruik guards voor gevalsonderscheid filter :: (aBool) [a] [a] filter p [ ] = filter p (x:xs) = [ ] | p x | True = x : filter p xs filter p xs