INF3110/4110
L?sningsforslag uke 40 (1.-3.10.2003)
Oppgave 1
---------
fn x:real => x * x
fn (x,y) => x ^ y
fn x => fn y => x :: y
val kvadrat = fn x:real => x * x;
val concat = fn (x,y) => x ^ y;
val cons = fn x => fn y => x :: y;
Oppgave 2
---------
Ja, versjon (B) er mer effektiv hvis (f x) - som returnerer en
funksjon - skal anvendes p? mange forskjellige y-verdier.
For ? se dette, anta at funksjonen som returneres ved kallet (f x)
bindes til en ML-identifikator for ? anvendes senere. I versjon (A)
blir dette en funksjon som tar y som argument og som gir (h (g x) y)
som verdi. For hvert kall med denne funksjonen, s? m? (h (g x)) regnes
ut f?rst; alltid med samme resultat. I versjon (B) s? blir (f x) den
funksjonen som returneres ved at (h (g x)) regnes ut. Denne
utregningen blir foretatt bare en gang i motsetning til i versjon (A).
Oppgave 3
---------
fun hundre (x:real) =
let val fire = x*x*x*x
val tyve = fire*fire*fire*fire*fire
in
tyve*tyve*tyve*tyve*tyve
end;
Oppgave 4
---------
fun pluss x y = x + y;
fun lagfunksjoner ls = map (fn n => (pluss n)) ls;
fun appliser ls x = map (fn f => f x) ls;
Oppgave 5
---------
fun flatten l = foldr op@ [] l;
fun cons (x,y) = x :: y;
fun reverser l = foldl cons [] l;
fun lengde l = foldr (fn (_,n) => n + 1) 0 l;