tentamen i dva 201 funktionell programmering med f

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