Alle programmer for oppg. 1-4. skal skrives i SML. (I allle tilfeller skal du skrive et fullstendig program med evt. hjelpefunksjoner og andre noedvendige definisjoner.) Oppgave 0.___(typing)_______________________________________________ Besvar denne oppgaven foerst uten noen programmering eller kjoering av programmer - bare ved aa analysere funksjonsdefinisjoner. Hvilken type har foelgende funksjoner (marker ogsaa eventuelle feil, dvs. tilfeller der ingen type lar seg bestemme): a) fun id(x) = x; b) fun li(x) = [x]; c) fun com(x,y) = (x,y); d) fun cmpl(x,y,z,y) = ((x,y),(z,y)); e) fun split [] = ([],[]) | split((x,y)::L) = let val (L,R) = split L in (x::L,y::R); f) fun comb([],[]) = [] | comb(x::L,y::R) = (x,y)::comb(L,R); ML-tolker vi gi en advarsel etter denne definisjonen. Kan du si hvilken og hvorfor? Generealiser funksjonen til aa unngaa denne meldingen fra tolkeren. g) fun hei(a,b,c) = if a(b) then b else c; h) fun hei(a,b,c) = if a(b) then b else c(b); i) fun hei(a,b,c) = if a(b) then b else b(c); Oppgave 1.__________________________________________________________ Programmer foelgende funksjoner (pass paa aa faa riktige typer): a) member(x,L) : 'a * 'a list -> bool, som returnerer true hvis og bare hvis elementet x forekommer i listen L; b) less(x,L) : int * int list -> int list, som returnerer en del-liste av L med alle og kun elementer fra L som er mindre enn x; c) upd(i,v,L): 'a*'b * ('a*'b) list -> ('a*'b) list, som oppdaterer elementet (i,x) i listen L til aa bli (i,v). Hvis ingen elementer i L har i som indeks (indeks er foerste elementet i paret (i,_)) skal (i,v) legges til listen. [Vi kan tenke paa L som en "ordbok" av par (noekkel,verdi) og upd(i,v,L) skal oppdatere verdien lagret ved i til aa bli v.] Oppgave 2.__________________________________________________________ Programmer en funksjon flat(X) : 'a list list -> 'a list, som tar som input X en liste av lister av heltall og returnerer en flat liste som tilsvarer sammensetting av alle listene i X. F.eks., flat [[1,2,3],[1,2,3],[],[4,5]] = [1,2,3,1,2,3,4,5]. Oppgave 3.__________________________________________________________ Paa forelesning har vi definert en datype av binaere traer med heltall i noder: datatype BT = bl of int | bt of BT*int*BT ; Programmer en funksjon sum(T) : BT -> int, som tar som input et BT element T og returnerer summen av alle tall lagret ved noder i T. Oppgave 4.___(litt I/O)_____________________________________________ Funksjon explode: string -> char list, ekspanderer en streng til en liste av enkle tegn paa en brukbar, men litt spesiell maate. F.eks. -- explode "123 sd z"; -- explode "(-((- 0)*1))"; gir: val it = [#"1",#"2",#"3",#" ",#"s",#"d",#" ",#"z"] : char list val it = [#"(",#"-",#"(",#"(",#"-",#" ",#"0",#")",#"*",#"1",#")",#")"] : char list Programmer en funksjon avblank som tar en slik liste som input og fjerner alle blanke symboler, dvs. avblank kalt paa to lister over skal gi: val it = [#"1",#"2",#"3",#"s",#"d",#"z"] : char list val it = [#"(",#"-",#"(",#"(",#"-",#"0",#")",#"*",#"1",#")",#")"] : char list Oppgave 4.a._______________________________________________________ Foelgende funksjonen kan brukes for aa lese inn en streng fra en fil ("fts" staar for "file to string"): fun fts(file) = let val stream = TextIO.openIn file val str = TextIO.inputAll(stream) val _ = TextIO.closeIn stream in str end; Resultatet av et kall fts "navn" er at hele innholdet av filen navn returneres som en streng (med evt. metategn, som "\n" for linjeskift, o.l.). Lag en fil navn som kan brukes som testinput til forrige oppgave og proev et kall avblank(fts "navn").