TENTAMEN I DVA 201 FUNKTIONELL PROGRAMMERING MED F# Torsdagen den 15 augusti 2013, 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 4 juli 2013. 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 och bladnummer. • 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 (7 POÄNG) a) Definiera en funktion prime som testar huruvida ett givet heltal ≥ 2 är ett primtal eller ej. För full poäng måste din lösning vara rimligt effektiv. (4p) b) Använd din funktion från a) för att deklarera en funktion som tar ett heltal n som argument och returnerar en lista med alla primtal mellan 2 och n! Om du inte löst uppgift a) får du anta att en funktion prime som testar för primtal finns. För full poäng måste din lösning utnyttja en eller flera av de inbyggda högre ordningens funktionerna i F# på ett icke-trivialt sätt! (3p) Ledning: för att lösa a) kan följande funktioner och operatorer vara användbara: • m % n beräknar m modulo n, dvs. resten som uppstår när man heltalsdividerar m med n. • sqrt x returnerar kvadratroten ur flyttalet x. • ceil x returnerar det närmaste heltalet som är större än eller lika med flyttalet x. Notera att detta heltal har typen float. Så t.ex. gäller att ceil 16.3 = 17.0. UPPGIFT 2 (3 POÄNG) a) Vad har 0 för typ? Samma fråga för 1.0? (1p) b) Betrakta följande F#-deklarationer: 1 let g x = x + 1.0 let f x = match x with | Some x -> x + g x | Nothing -> 0 Vad händer om man försöker kompilera dessa som de står? (2p) UPPGIFT 3 (6 POÄNG) a) Deklarera en funktion som hittar den första positionen av ett värde x i en array a! Om i är det lägsta index för vilket a.[i] = x så ska funktionen returnera Some i och om x inte finns i a ska Nothing returneras. (4p) b) Deklarera en funktion som kan användas för att ta hand om resultatet av funktionen i a) på följande sätt. Om x hittades ska positionen där den hittades skrivas ut och om den inte hittades ska texten "x not found" skrivas ut. (2p) UPPGIFT 4 (3 POÄNG) Betrakta följande deklaration: let l = lazy(printf "Hi there!\n"; 17) a) Vad får l för värde, och vilken typ kommer detta värde att ha? (1p) b) Vad händer när uttrycket l.Force() evalueras och vilket värde kommer att returneras? (1p) c) Ifall l.Force() evalueras en gång till, vad händer då, vilket värde returneras, och varför? (1p) UPPGIFT 5 (6 POÄNG) Ett företag i maskinbranschen tillverkar “konstruktioner”. Varje konstruktion innehåller ett visst antal skruvar och ett visst antal muttrar. En konstruktion kan vara av två slag: • en enkel konstruktion, som innehåller ett visst antal skruvar och ett visst antal muttrar, eller • en sammansatt konstruktion, som består av två ihopsatta konstruktioner. a) Deklarera en datatyp i F# som representerar båda sorternas konstruktioner! För enkla konstruktioner ska antalet skruvar respektive muttrar innehållas och sammansatta konstruktioner ska innehålla delkonstruktionerna. (2p) b) För att en enkel konstruktion ska vara vettig måste den innehålla samma antal skruvar som muttrar (annars skulle det ju bli skruvar eller muttrar över när man skruvat ihop den). För en sammansatt konstruktion gäller att den är vettig endast när alla de enkla konstruktioner som den innehåller är vettiga. Deklarera ett predikat som går igenom en godtycklig konstruktion och avgör om den är vettig eller ej! (4p) UPPGIFT 6 (5 POÄNG) Funktionen repeat definieras av: let rec repeat x n = match n with | 0 -> [] | _ -> x :: repeat x (n-1) a) Vad returnerar repeat? (1p) b) Härled en typ för repeat! För full poäng ska den härledda typen vara den mest generella. Ordentlig motivering krävs. (4p) Lycka till! Björn 2