TENTAMEN I DVA 201 FUNKTIONELL PROGRAMMERING MED F# Torsdagen den 16 juni 2010, kl 8:10 – 12:30 Kurslitteratur är inte tillåten, och inte eller andra hjälpmedel som på något sätt kan ersätta kurslitteraturen (t.ex. egna anteckningar, andra böcker i ämnet, kopior av OH-bilder, datorer eller räknare med dito lagrad information). Endast generella hjälpmedel är tillåtna, som räknare utan lagrad information av betydelse för kursen, ordbok, allmän formelsamling och liknande. För godkänt krävs 15 poäng, max är 30 poäng. Resultatet offentliggörs senast torsdagen den 7 juli 2010. Vänligen observera följande: • Motivera alltid dina svar. Bristande motivering kan ge poängavdrag. Omvänt kan även ett felaktigt svar ge poäng, om det framgår av motiveringen att tankegången ändå är riktig. • Skriv tydligt! • Varje blad skall vara försedd med uppgiftsnummer, bladnummer och anonymkod. • Endast en uppgift på ett och samma blad. • Skriv enbart på ena sidan av ett blad. • Uppgifterna är inte nödvändigtvis sorterade i svårighetsgrad. Om du kör fast kan det löna sig att gå vidare till nästa uppgift. • Lösningsförslag kommer att finnas på kursens hemsida efter att tentan är slut. Frågor: Björn Lisper på 021-151709. UPPGIFT 1 (4 POÄNG) Deklarera en funktion som tar en lista och returnerar en lista med vartannat element borttaget. T.ex. ifall funktionen heter f så ska gälla att f [2;4;3;1;7] = [2;3;7]. UPPGIFT 2 (11 POÄNG) Ibland har man stora arrayer där många element är samma. T.ex. för numeriska arrayer är det vanligt att man har många nollor. Sådana arrayer, där många element har ett och samma värde v kan lagras effektivt i en datastruktur som består av en s.k. associationslista där elementen är par av index och värde. Iden är att man i listan lagrar bara sådana element i arrayen som är skilda från v. T.ex. arrayen [|’b’;’a’;’a’;’a’;’e’;’a’;’c’|] kan man lagra som associationslistan [(0,’b’);(4,’e’);(6,’c’)]. Om man slår upp värdet för ett index i denna lista (motsvarande att indexera i en array) ska man få tillbaks det värde som är lagrad ihop med det indexet, annars“defaultvärdet” ’a’ ifall inget par med indexet ifråga finns i listan. Notera att man förutom associationslistan även behöver lagra listans “default”-värde någonstans, så man behöver en lite mer komplicerad datastruktur än bara listan. a) Deklarera en funktion arr2assoc a v, som konverterar en array a till en associationslista med defaultvärde v. (Notera som sagt att du också måste lagra v någonstans i den datastruktur som du returnerar.) (4p) b) Deklarera en funktion lookup ass i, som slår upp värdet associerat med index i i associationslistan ass (motsvarande indexering i motsvarande array). (3p) c) Deklarera en funktion assocmap f ass, som “mappar” funktionen f över associationslistan ass på samma sätt som funktionen Array.map mappar f över en array (eller List.map över en lista). (4p) 1 OBS: man kan lösa b) och c) även om man inte har löst a). UPPGIFT 3 (2 POÄNG) Betrakta följande funktionsdeklaration: let rec f x = 3 + f (x + 3) let g x y = if x = ’a’ then 0 else y Om man nu försöker räkna ut g ’a’ (f 0) i F#, vad händer då (och varför)? Om man försöker räkna ut motsvarande uttryck i ett språk med lat evaluering (call-by-need), vad händer då (och varför)? UPPGIFT 4 (6 POÄNG) I logiken byggs booleska uttryck upp av konstanterna true, false, funktionen not, samt de binära operatorerna and och or. Ett exempel är uttrycket true or (not false). a) Man kan representera booleska uttryck med träd. Deklarera en datatyp i F# för träd som representerar booleska uttryck enligt ovan! (2p) b) Varje booleskt uttryck enligt ovan evaluerar till antingen true eller false. (T.ex. true or (not false) evaluerar till true.) Deklarera en funktion som tar ett träd som representerar ett booleskt uttryck och evaluerar de booleska uttrycket! (4p) UPPGIFT 5 (2 POÄNG) Kan man säga att F# är ett rent funktionellt programspråk? Motivera ditt svar! UPPGIFT 6 (5 POÄNG) Funktionen numbers definieras av: let rec numbers n = match n with | 0 -> [] | n -> n :: numbers (n - 1) a) Vad gör funktionen numbers? (1p) b) Härled en typ för numbers! För full poäng ska den härledda typen vara den mest generella. Ordentlig motivering krävs. (4p) Lycka till! 2 Björn