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;