Uppgift 3 måste lämnas senast tisdag 15/10 kl. 08:00. Lämna in den med hjälp av inlämningssystemet i slutet av denna sidan. Se till att läsa igenom kodkonventionerna innan du börjar. Dessa skall följas.
Överst i din fil ska följande finnas (inom kommentartecken):
Skriv svaren på uppgifterna 1 och 6 inom kommentartecken!
Se till att du gett ett svar på varje deluppgift.
Förutom de SML-biblioteksfunktioner du använt tidigare kommer du att behöva funktionen String.substring. Den fungerar enligt följande specifikation:
String.substring(s,p,l) : string*int*int->string
PRE: 0 <= p <= size(s), 0 <= l <= size(s)-p
POST: Delsträngen med längd l som börjar på plats p i strängen s. Första tecknet i s har plats 0.
SIDE-EFFECTS: (none)
EXAMPELS: String.substring("abcd",1,2) = "bc"
Gör helst denna uppgift utan att provköra den, som en övning i att läsa SML-kod. Om du inte alls lyckas gissa, mata då in den till SML och försök komma på vad den gör.
Betrakta nedanstående procedurdefinition.
fun foo(x, y, z) = if size(x) < 2 then str(y) ^ str(z) else if (String.sub(x, 0) = y andalso String.sub(x, size(x)-1) = z) then str(z) ^ String.substring(x, 1, size(x)-2) ^ str(y) else str(y) ^ str(z);
Skriv en funktion num2month som får ett heltal som argument och returnerar en sträng som är det korresponderande månadsnamnet utskrivet med bokstäver. 1 motsvarar januari och 12 motsvarar december. Skriv funktionen med matchning i definitionen (inte case).!
Här nedan ses exempel på hur den ska fungera.
- num2month(1); > val it = "januari" : string - num2month(7); > val it = "juli" : string - num2month(13); > val it = "felaktig månad" : string
Värdet över 12 eller under 1 returnerar alltså värdet "felaktig månad".
Skriv en procedur sqrts som givet ett positivt flyttal returnerar båda kvadratrötterna till detta tal (dvs både 3.0 och -3.0 är möjliga rötter till 9.0) som en tupel.
I engelska är (uttalsmässigt) endast bokstäverna a, e, i, o och u vokaler. Predikatet isVowel är sant för tecken som är en engelsk vokal (versal eller, gemen). Skriv en procedur isVowel : char -> bool som beräknar isVowel. Använd matchning!
Exempel: isVowel(#"I") = true isVowel(#"f") = false
Predikatet beginsWithVowel är sant för strängar vars första tecken är en vokal (versal eller gemen). Skriv en procedur beginsWithVowel som beräknar beginsWithVowel. Vad som händer om er procedur appliceras på en tom sträng ("") behöver ni inte bry er om, men kolla gärna! Det är ingen nackdel om det ger en paniksituation (exception).
Exempel:
beginsWithVowel("I") = true beginsWithVowel("f") = false beginsWithVowel("ape") = true
För att i engelskan få obestämd form av ett substantiv på grundform skriver man artikeln 'a' före substantivet försåvitt det ordet inte börjar med en (uttalsmässig) vokal då man skriver 'an' i stället. Funktionen indetermined tar ett ord med ett substantiv i grundform och ger ett ord med substantivet i obestämd form.
Skriv en procedur indetermined : string -> string som beräknar indetermined (den skall förutsätta att den givna strängen verkligen är ett substantiv på grundform).
Exempel:
indetermined("accident") = "an accident"
Skriv en procedur isEven som returnerar sant om dess argument är ett jämnt tal.
Några exempel på vad vi vill att proceduren ska returnera:
- isEven(42); > val it = true : bool - isEven(4711); > val it = false : bool
Betrakta nedanstående fem funktionsdefinitioner.
fun test1(v) = let val x = v + v; val y = x + x; in y + y end; fun test2(v) = let fun x(a) = a + a; fun y(a) = x(a) + x(a); in y(v) + y(v) end; fun test3(v) = let fun x(a) = a + a; fun y(a) = let val b = x(a); in b + b end; in y(v) + y(v) end; local fun x(a) = a + a; fun y(a) = x(a) + x(a); in fun test4(v) = y(v) + y(v); end; local val x = v + v; val y = x + x; in fun test5(v) = y + y; end;
Är dessa fem deklarationer av funktionerna test1
-
test5
alla riktiga i den meningen att de är korrekt ML?
Om någon inte är riktig - varför inte? (Prova gärna att köra
deklarationerna i ML).
Gå för hand igenom beräkningen av ett anrop till varje
test
-funktion (med t.ex. argumentet 1). Hur många
additioner utförs vid ett anrop till respektive funktion?
Hämta ett formulär för att lämna in uppgiften genom att fylla i fälten nedan.