Het gebruik van FP op een meeloopdag voor
Het gebruik van FP op een meeloopdag voor middelbare scholieren Paul de Mast
Doelstelling meeloopdag • Doelstelling: – Realistisch beeld geven van studeren bij de AIM – Mix van werkvormen en inhoud moet overeenkomen met het curriculum • Doelgroep:
Onderdelen meeloopdag – Overzicht curriculum / onderwijsmodel – Projectmanagement – Website bouwen – Programmeren – Mini proftaak
Onderdeel programmeren • Afgelopen jaren vaak een praktijkles Delphi of Java: – Alleen wat stoeien met een GUI-builder – Beeldvorming van programmeeronderwijs klopte niet – Probleem: voorkennis is divers • Een poging met FP: – Onbekendheid van FP is soms een voordeel – Een 'echt' programma kan vaak kleiner zijn
Gekozen probleemstelling • Moet eenvoudig te begrijpen zijn. • Probleemstelling moet wel interessante aspecten bevatten. • Iets grafisch wordt vaak leuk gevonden, maar moeilijk om in 1 uur tijd vorm te geven. • Voordelen FP benutten
Probleemstelling: Flippo-24 Los de volgende puzzel op: gebruik deze 4 getallen precies 1 keer + -*/ je mag deze operatoren willekeurig vaak gebruiken 24
Twee iteraties: 1. flippo 1 : : [Getal] -> Bool 2. flippo 2 : : [Berekening] -> Oplossingen
Aspecten van het probleem - Er zijn een aantal abstracties mogelijk (aantal getallen, gebruikte operaties, eindwaarde). - Gebruik van recursie is aan de hand van dit probleem goed uit te leggen - Aantal instanties van het probleem zijn eenvoudig: 1, 2, 3, 4 - Aantal instanties van het probleem zijn lastiger: 1, 6, 6, 8
Leerlingen laten bedenken… – Geen van de getallen mag dubbel gebruikt worden – Alle getallen moeten gebruikt worden – Het eindresultaat (24) is een geheel getal, maar de tussenresultaten hoeven gehele getallen te zijn: (8 / 3) * (10 - 1) = 24 – Hoe zit het met delen door 0? – Hoe zit het met het aantal mogelijke expressies?
Flippo 1 flippo 1 : : [Real] -> Bool flippo 1 [] = False flippo 1 [x] = x == 24. 0 flippo 1 xs = or [ \ , , ] flippo 1 [f x y : remove. Members xs [x, y] ] x <- xs y <- remove. Member x xs f <- operaties
Flippo 2 : : Berekening : == (Real, String) koppel : : Operatie Berekening koppel = f (f x y , berekening (x, s) Berekening -> Berekening (y, t) "(" +++ s +++ vertaal f +++ t +++ ")" ) beschrijving van de nieuwe berekening
Flippo 2 : : Operatie : == operaties : : operaties = (Real -> Real) [ Operatie ] [(+), (-), (*), (/)] vertaal : : Operatie -> String vertaal f | f 8. 0 4. 0 == 12. 0 = "+“ | f 8. 0 4. 0 == 4. 0 = "-“ | f 8. 0 4. 0 == 32. 0 = "*“ | otherwise = "/"
Flippo 2 flippo 2 : : [Berekening] -> [String] flippo 2 [] = [] flippo 2 [(24. 0, s)] flippo 2 [(ander, s)] = [s] = [] flippo 2 xs = flatten [ flippo 2 [koppel f x y : remove. Members xs [x, y] ] \ x <- xs , y <- remove. Member x xs , f <- operaties ]
Ervaringen - In de weinige tijd mag niets fout: - Clean project al helemaal opgestart - Warnings uit zetten - Weinig problemen meer met diversiteit in voorkennis, maar les wordt wel meer gewaardeerd door leerlingen die wel eens geprogrammeerd hebben. - Leerlingen begrijpen het verhaal t/m flippo 1 goed, maar daarna haakt een gedeelte af. - Gehoorde opmerkingen: - Wat een vage taal! Waar is de GUI-(builder)? Kun je die "cannot unify errors" ook uitzetten? cool - Waardering door leerlingen: een ruime 7
- Slides: 14