Imperatief programmeren Programma bestaat uit opdrachten gegroepeerd in methoden Runnen is één voor één uitvoeren te beginnen met main Functioneel programmeren Programma bestaat uit functie-definities Runnen is uitrekenen van een expressie Logisch programmeren Programma bestaat uit predicaat-definities Runnen is vervullen van een predicaat proberen te Functie-definitie static int kwad (int x) { return x*x ; } kwad :: Int Int kwad x = x * x Haskell Gebruik van de functie public static void main(String [ ] ps) { System.out.println( this.kwad(5) ); } main :: Int main = kwad 5 Haskell 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” : > 1 : [2, 3, 4] [1, 2, 3, 4] “samenvoegen” > [1, 2] ++ [3, 4, 5] [1, 2, 3, 4, 5] ++ Prelude: functies op lijsten “leeg?” null > null [ ] True “allemaal waar?” and > and [ 1<2, 2<3, 1==0] False “neem deel” > take 3 [2..10] [2, 3, 4] take Functies als parameter Pas functie toe op alle elementen 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 graag zonder product te gebruiken = 1 = n * fac (n-1) “recursie” Lijst-patronen null :: [Int] Bool null [ ] = True null (x:xs) = False head :: [Int] Int head (x:xs) = x tail :: [Int] [Int] head (x:xs) = xs Zelftest Definieer de recursieve functie sum 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) prioriteitsregel 5+3*2 16 11 associatief 5+3+2 10 10 links-associatief 55 -- 33 - 2 0 4 rechts-associatief 5^3^2 1252 59 machtsverheffen Quiz (logica) associatief FTF F F associatief FTF T T rechts-associatief FF F TT F T implicatie Quiz (Haskell) los element op kop van lijst rechts-associatief associatief x : y : zzs x ++ y ++ z lijsten samenvoegen Quiz (Helium) toepassen van een functie links-associatief links-associatief map y z [1,2,3] mapf fac boven nn k boven Partieel parametriseren Stel: En dan: plus :: Int Int Int plus x y = x + y drieMeer :: Int Int drieMeer = plus 3 > map drieMeer [1, 2, 3, 4, 5] [4, 5, 6, 7, 8] Partieel parametriseren Omgekeerd: drieMeer = plus 3 drieMeer :: Int Int En dus: rechts-associatief plus :: Int (Int Int) plus :: Int Int Int “Curry-ing” Type f :: Int Bool String Aanroep > f 7 True “hoi” rechts-associatief links-associatief zonder haakjes! 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 functie als parameter map filter Functie met een functie als resultaat inverse afgeleide elke functie met >1 parameter! Hogere-ordefuncties Een lijst langs lopen en met elk element iets doen map Een lijst langs lopen en sommige elementen selecteren 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 Schrijf een functie kleintjes die getallen van een lijst oplevert die 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 = x : filter p xs | True = filter p xs