PROGRAMMEREN LOGISCH en FUNCTIONEEL Ik zeg wat ik denk!
Opbouw nDeel 1: Functioneel programmeren docent: Jeroen Fokker (informatica) tot de kerstvakantie (week 47-51) nDeel 2: Logisch programmeren docent: Louis des Tombe (letteren) na de kerstvakantie (week 2-5)
deel 1: Functioneel programmeren H1H2 H3.1H3.2 H4H5.1 H5.2 App. A tentamen Pr.1 Pr.2
Imperatief programmeren nProgramma bestaat uit nRunnen is opdrachten gegroepeerd in methoden één voor één uitvoeren te beginnen met main
Functioneel programmeren nProgramma bestaat uit nRunnen is functie-definities uitrekenen van een expressie
Logisch programmeren nProgramma bestaat uit nRunnen is predicaat-definities proberen te vervullen van een predicaat
Geschiedenis van programmeertalen Lisp Prolog Assembler Mach.taal Fortran Algol Basic Pascal Simula C C++ Java C# Haskell Gofer Miranda Scheme ImperatiefFunctioneelLogisch
Functie-definitie static int kwad (int x) { return x*x ; } kwad x = x * x Haskell kwad :: Int Int
Gebruik van de functie public static void main(String [ ] ps) { System.out.println( this.kwad(5) ); } main = kwad 5 Haskell main :: Int
Compilers voor Haskell nHelium nHugs (Haskell User’s Gofer System) nGHC (Glasgow Haskell Compiler)
Helium nCompiler èn interpreter nVereenvoudigd type-systeem nBegrijpelijke foutmeldingen nUtrechts nGloednieuw nExperimenteel
Helium-interpreter H:\> hi > > sqrt > * 3 11 > sin 0.3 *. sin cos 0.3 *. cos functie uit de standaard prelude Int - operatoren Float - operatoren
Lijsten nLijst: rijtje elementen van hetzelfde type [ 1, 3, 8, 2, 5 ] vierkante haken [ ] “tot en met”
Functies op lijsten > sum [1.. 10] 55 > reverse [3.. 8] [8, 7, 6, 5, 4, 3] > length [1, 5, 9, 3] 4 > replicate 5 2 [2, 2, 2, 2, 2]
Zelf functies definiëren module Statistiek where n! = 1*2*...*n ( ) n k n!n! k! (n-k)! = fac n = product [1..n] boven n k = fac n / (fac k * fac (n-k))
Functie-definitie static int fac (int n) { int tel, res; res = 1; for (tel=1; tel<=n; tel++) res *= tel; return res; } fac n = product [1..n] Haskell fac :: Int Int
Gebruik van functies nMet de interpretern Met de compiler module Stat where fac n = product [1..n] module Stat where fac n = product [1..n] main = fac 6 H:\> hi > :l Stat > fac H:\> helium Stat.hs H:\> lvmrun Stat 720
Soorten definities nFunctie nConstante nOperator fac :: Int Int fac n = product [1..n] pi :: Float pi = ( !^! ) :: Int Int Int n !^! k = fac n / (fac k * fac (n-k))
Prelude: functies op Int nRekenkundige operatoren nVergelijkings- operatoren nFuncties + - * / ^ == /= >= abs signum gcd
Prelude: functies op Float nRekenkundige operatoren nVergelijkings- operatoren nFuncties *. /. ^. ==. /=.. >=. sqrt sin log exp truncate
Prelude: functies op Bool nLogische combinaties nFuncties && || not
Prelude: operatoren op lijsten n “op kop van” n “samenvoegen” : ++ > 1 : [2, 3, 4] [1, 2, 3, 4] > [1, 2] ++ [3, 4, 5] [1, 2, 3, 4, 5]
Prelude: functies op lijsten n “leeg?” n“allemaal waar?” n“neem deel” null and > null [ ] True > and [ 1<2, 2<3, 1==0] False take > take 3 [2..10] [2, 3, 4]
Functies als parameter nPas 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, , , 2.0] > map even [1.. 6] [False, True, False, True, False, True]
Functies definiëren nDoor 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
Functies met meer parameters nmet een lijst als resultaat boven :: Int Int Int boven n = fac n / (fac k * (fac (n-k)) omtrekOppervl :: Int Int [Int] omtrekOppervl len br = [ 2*(len+br), len*br ]
Hergebruik deel-formules ngeef de deelformules een naam abc :: Float Float Float [Float] abc a b c = [ (-b +sqrt(b*b-4*a*c)) / (2*a), (-b - sqrt(b*b-4*a*c)) / (2*a) ] abc a b c = [ ( -b +d ) / n, ( -b - d ) / n ] d = sqrt (b*b – 4*a*c) n = 2*a where
Gevallen onderscheiden abs :: Int Int abs x = x = -x | x>=0 | x<0 “guards”
Herhalen fac :: Int Int fac n = 1 = | n==0 | n>0 “recursie” n * fac (n-1) graag zonder product te gebruiken
Definitie met patronen dag :: Int String dag 1 = “maandag” dag 2 = “dinsdag” dag 3 = “woensdag” dag 4 = “donderdag” dag 5 = “vrijdag” dag 6 = “zaterdag” dag 7 = “zondag” constante als formele parameter!
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
Patronen èn recursie sum :: [Int] Int sum [ ] = 0 sum (x:xs)= x + sum xs length :: [Int] Int length [ ]= 0 length (x:xs)= 1 + length xs
Het type van length length :: [Int] Int length [ ]= 0 length (x:xs)= 1 + length xs [a] Int “polymorf” null:: [a] Bool head:: [a] a tail:: [a] [a]
Publieksvraag: Het type van map map :: > map fac [1, 2, 3, 4, 5] [1, 2, 6, 24, 120] > map even [1.. 6] [False, True, False, True, False, True] [a] (a b) [b]
Practicum nzaal 408 en 412 (2 personen per computer) BBL
Website