Department of Information and Computing Sciences

Departement Informatica Onderwijs
Bachelor Informatica Informatiekunde Kunstmatige intelligentie Master Computing Science Game&Media Technology Artifical Intelligence Business Informatics

Onderwijs Informatica en Informatiekunde

Vak-informatie Informatica en Informatiekunde

Functioneel programmeren

Website:website met extra informatie
Vakcode:INFOFP
Studiepunten:7.5 ECTS
Periode:periode 1 (week 36 t/m 45, d.w.z. 3-9-2012 t/m 9-11-2012; herkansing week 1)
Timeslot:A
Deelnemers:tot nu toe 256 inschrijvingen
Rooster:De officiële roosters staan ook in Osiris
Docenten:Dit is een oud rooster!
vormgroeptijdweekzaaldocent
college          Doaitse Swierstra
 
practicum groep 1        Alex Elyasov
Manuel Kerssemakers
  
groep 2        Alex Elyasov
Gabe Dijkstra
  
groep 3        Jan Rochel
Michelle Meekes
  
groep 4        Jan Rochel
Jelco Bodewes
  
groep 5        Frank Staals
Guido Passage
  
Tentamen:
week: 1do 4-1-201817.00-20.00 uurzaal: EDUC-GAMMAaanvullende toets
Inhoud:In het vak imperatief programmeren hebben jullie kennis gemaakt met de taal C# . In die taal bestaat een programma uit opdrachten: doe dit, doe dat. In een functionele taal bestaat een programma uit functies zoals je die kent uit de wiskunde. Programma's schrijven in zo'n taal vergt een andere manier van denken en dat is precies waar we het in dit vak over gaan hebben. In concreto gaan we problemen oplossen met behulp van de functionele taal Haskell. Deze taal kent uitgebreide abstractiemogelijkheden waardoor programma's vaak bijzonder compact zijn. Over veel details, zoals berekeningsvolgorde en geheugenallocatie, hoef je je geen zorgen te maken. De nadruk ligt op wat en niet op hoe. Verder kent Haskell een uitgebreid typesysteem waarvan steeds meer elementen ook in andere talen worden opgenomen.

Recursie in functionele talen is de evenknie van lusconstructies (for, while) in Java. Het is de manier om programma's te schrijven die over een datastructuur wandelen of herhaalde berekeningen doen. Omdat functionele programma's geen variabelen kennen die van waarde kunnen veranderen tijdens de verwerking van het programma is het gemakkelijk redeneren over zulke programma's. We zullen laten zien hoe we op een systematische wijze programma's kunnen afleiden en transformeren, en hoe we eigenschappen kunnen bewijzen. Die eigenschappen kunnen we gebruiken om uitspraken te doen over de correctheid of om programma's te herschrijven. Als het programma recursieve functies bevat dan is tijdens bewijzen het begrip inductie nodig.
Literatuur:
  • Dictaat: Functioneel programmeren (versie 2012-2013); verkrijgbaar op de website bij aanvang van vak, en kort daarna bij Bureau Onderwijszaken
  • Haskell Report (toegankelijk via web pagina)
  • Haskell Library Definities (idem)
  • Zie verder de wiki site van dit vak.
Werkvorm:Per week:
  • 2*2 uur hoorcollege
  • 2*2 uur werkcollege (direct na hoorcollege, gelegenheid vragen te stellen over practicum)
Toetsvorm:Het vak wordt beoordeeld aan de hand van twee toetsen (t1, t2) en drie practica (p1, p2, p3), een eventueel aanwezig cijfer voor de aanvullende toets (t3) en het aanvullend practicum (p4).
compute :: Record -> Either Float String
compute r@(Record number name p1 p2 p3 p4 t1 t2 t3) 
   = let -- we berekenen een eerste benadering voor het theoriecijfer; is de tweede toets beter gemaakt dan
         -- de eerste dan nemen we dat cijfer
         ta = (0.4*t1+0.6*t2) `max` t2
         -- als ta of t4 tenminste een 4 is, of aan de tweede toets is niet
         -- deelgenomen, of er is niets ingeleverd  dan nemen we 
         -- ook het cijfer behaald van de aanvullende toets (t3) in beschouwing 
         t  = ta `max` (if (ta >= 4 || t2 == 0 ) then t3 else 0)
         -- het eindcijfer voor het praktikum bestaat uit een gewogen gemiddelde van de drie toetsen
         pa  = (p1 + 2*p2 + 2*p3)/5 
         -- eventueel kan men een extra toets in de herkansing maken, die het laagste cijfer vervangt
         -- in dat geval tellen alle toetsen even zwaar         
         pb = ((p1 + p2 + p3 + p4) - foldr min 10 [p1,p2,p3,p4])/3
         p  =  pa `max` (if p4 > 0 then pb else 0)
         -- we berekenen nu een voorlopig eindcijfer  
         c  = (p+t)/2
         -- we eisen echter dat zowel het cijfer voor het theoriegedeelte als voor het praktikum
         -- tenminste een 5 is
         e  = if p >= 5 && t >= 5 then c else (5 `min` c)
         -- cijfers hoger of gelijk 6 worden afgerond op halve cijfers
         -- en eronder op hele cijfers
         w  = (if e >= 6 then ((/2) . fromInteger.round.(2*)) else fromInteger. round)  e
     in  -- tenminste 3 praktikum opgaven dienen te zijn gemaakt
         -- en men dient deelgenomen te hebben aan de eindtoets of de verlengde toets
         if length (filter (/=0)  [p1,p2, p3,p4]) >= 3 && (t2 + t3) > 0 then Left w else Right "ONVOLTOOID"


Aanvullend practicum vindt plaats aan het begin van periode 2. De aanvullende toets vindt plaats halverwege periode 2. Deelresultaten van voorgaande jaren zijn niet inzetbaar.

Voor het overige zijn de regels zoals vermeld in het Onderwijs en Examenreglement van kracht. Dit algoritme is een poging de regeling strak vast te leggen. Kleine aanpassingen kunnen nodig zijn, om eventuele onrechtvaardige gevallen alsnog te laten slagen. het is bij het practicum toegestaan, en zelfs aanbevolen, om met twee personen aan een opdracht te werken en die samen in te leveren. Beide personen kunnen individueel aangesproken worden op het ingeleverde werk, en dienen ervoor te zorgen dat ook hun partner volledige begrip heeft van het ingeleverde werk.
Inspanningsverplichting voor aanvullende toets:Om aan de aanvullende toets te mogen meedoen moet de oorspronkelijke uitslag minstens 4 zijn of niet ingeleverd.
wijzigen?