1-0::[1,2]; 2 - [3,4]; 3 - [1,2] :: [3,4]; 4-1 :: 2 :: 3 :: nil; 5 - "INF" ^ "3110" ^ " er moro"; 6 - rev [1,2,3];



Like dokumenter
INF3110 Programmeringsspråk. Dagens tema

Fortsetter med ML: Repetisjon av lister Typer Unntak Moduler og abstrakte datatyper Introduksjon til høyere-ordens funksjoner

Dagens tema. Funksjonelle språk Fortsetter med ML: Typer Unntak Introduksjon til høyere-ordens funksjoner. ML avsluttes etter planen neste uke.

Plan: Funksjonelle språk (Ghezzi&Jazayeri kap.7 frem til 7.4) IN 211 Programmeringsspråk

Plan: Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) Funksjonelle språk. Innføring i ML. typer enkle funksjoner (Fortsetter med ML i to uker til)

INF3110 Programmeringsspråk. Dagens tema. Typer (Kapittel 3 frem til ) Innføring i ML (Kapittel & ML-kompendiet.) 1/19

Typer. 1 Type: boolean. 2 Verdimengde: {true, false} 3 Operatorer: NOT, AND, OR... 1/19. Forelesning Forelesning

Plan. Fortsetter med ML: lister og rekursive typer/funksjoner unntak let-uttrykk moduler og abstrakte datatyper høyere-ordens funksjoner

Dagens tema Innføring i ML - del IV

1/28. Forelesning Forelesning / fun f (_,0) = true. 2 f(0,_)=true. 3 f_ =false; 4 val f = fn : int * int -> bool

Dagens tema. Innføring i ML - del III (Kapittel & ML-kompendiet.) Unntak Abstrakte datatyper i ML Høyere-ordens funksjoner

Funksjoner: Kun faste funksjoner. Ikke rekursive kall. Funksjonelle språk (kap 4.4) Bakgrunnen for ML

ML (kap 5) INF3110/4110. Bakgrunn Litt historikk. Funksjonelle språk (kap 4.4) Bakgrunnen for ML. Programmeringsspråket ML Hvordan kjøre ML-programmer

Plan. Fortsetter med ML: lister og rekursive typer/funksjoner unntak let-uttrykk moduler og abstrakte datatyper høyere-ordens funksjoner

Variable Man kan bruke variable i ML. ML (kap 5 og 6) Nye datatyper INF3110/4110 INF3110/4110 INF3110/4110 INF3110/4110. Variable i ML.

Plan. funksjoner som funksjonsverdi funksjoner som datastruktur. funksjoner som parametre. Høyere-ordens funksjoner. ufullstendige kall.

ML (kap 5 og 6) INF3110/4110. Variable i ML. Nye datatyper. Currying. Avanserte listeoperatorer. Typeanalyse

Plan. funksjoner som funksjonsverdi funksjoner som datastruktur. funksjoner som parametre. Høyere-ordens funksjoner. ufullstendige kall.

Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Innlevering 2a i INF2810, vår 2017

INF5110. Oblig 2 presentasjon

Løsningsforslag til eksamen i IN 211 høsten 2002

UNIVERSITETET I OSLO

Kapittel 1 En oversikt over C-språket

Semantisk Analyse del III

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Øvingsforelesning 1 Python (TDT4110)

INF Oblig 2 semantikksjekk og kodegenerering

UNIVERSITETET I OSLO

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

Rekursjon og lister. Stephan Oepen & Erik Velldal. 1. februar, Universitetet i Oslo

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon

INF 1000 høsten 2011 Uke september

Plenumsregning 1. Kapittel 1. Roger Antonsen januar Velkommen til plenumsregning for MAT1030. Repetisjon: Algoritmer og pseudokode

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Eivind Gard Lund. 24. Mars 2009 Foilene bygger på 2009 utgaven av Andreas Svendsen

INF Noen oppgaver til kap. 8

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

Velkommen til INF2100 Jeg er Dag Langmyhr

Del 3: Evaluere uttrykk

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

MUSIKALSK TRIKKETUR APRIL

MAT1030 Diskret matematikk

Fiktiv eksamensbesvarelse IN 211 høsten 2001

INF Noen oppgaver til kap. 8

MAT1030 Plenumsregning 1

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

INF1010 notat: Binærsøking og quicksort

INF2810: Funksjonell Programmering

Kap 6.4: Typesjekking Foiler ved Birger Møller-Pedersen Forelest av Stein Krogdahl 19. og 23. mars Dagens tema: Typer og typesjekking

MAT1030 Diskret Matematikk

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

INF april, 2015 Stein Krogdahl Ifi, UiO. Svar på oppgaver til kap. 8. Ble lagt ut 24. april

PG4200 Algoritmer og datastrukturer Forelesning 3 Rekursjon Estimering

INF2220: Forelesning 7. Kombinatorisk søking

Oppgaver til INF 5110, kapittel 4, med svarforslag Gjennomgått torsdag 14. febr Disse foilene er justert 15/2, kl. 11

INF2220: Forelesning 1

Forelesning Adresseringsmodi Kap 5.4

INF2220: Forelesning 1

INF1000 Eksamen 2014 (modifisert)

Velkommen til plenumsregning for MAT1030. MAT1030 Diskret matematikk. Repetisjon: Algoritmer og pseudokode. Eksempel fra boka. Eksempel

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

MED SVARFORSLAG UNIVERSITETET I OSLO

Haskell. Kjetil Ørbekk. Programvareverkstedet, 19. mars 2009

Datatyper og typesjekking

INF2810: Funksjonell Programmering

Praktisk informasjon. Repetisjon: While-løkker. I dag. INF1000 (Uke 5) Mer om løkker, arrayer og metoder. Oblig 2 er lagt ut

Hjemmeeksamen 2 i INF3110/4110

Datatyper og typesjekking

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2

C# (.Net) Tema: Loops (Løkker) Leksjon 7 Kap 18

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Mandag Rom 01 Rom 21 Rom 22 Rom 23 Rom 24 Rom 31 Rom 33 Rom 34 Rom 35 Rom 36 Rom 37 Rom 41 Rom 42 Rom 43 Rom 44 Rom 45 Rom 46

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

INF5110, onsdag 19. februar, Dagens tema: Parsering ovenfra-ned (top-down)

TDT4165 PROGRAMMING LANGUAGES. Exercise 02 Togvogn-skifting

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

TDT4165 PROGRAMMING LANGUAGES. Exercise 01 Introduksjon til Oz

INF april, 2014 Stein Krogdahl Ifi, UiO. Svar på oppgaver til kap. 8

Datatyper og typesjekking

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Velkommen til INF2100

UNIVERSITETET I OSLO

INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon.

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

TDT Øvingsforelesning 1. Tuesday, August 28, 12

INF2810: Funksjonell Programmering. En metasirkulær evaluator

Transkript:

Dagens tema Innføring i ML - del II (Kapittel 7.4. & ML-kompendiet.) Oppvarming og uttøyning Smart typeanalyse Evalueringsmekanismen i ML Typedeklarasjoner (produkt-, union-, rekursive typer... ) Oppvarming og repetisjon 1-0::[1,2]; 2 - [1,2] @ [,4]; - [1,2] :: [,4]; 4-1 :: 2 :: :: nil; 5 - "INF" ^ "110" ^ " er moro"; 6 - rev [1,2,]; 7 - fun plussto(x : int) = x + 2; - plussto(~10); 9 - plussto ~10; 10 - plussto; 11 - it (it 1000); 12-2<andalso<2; 1-2<orelse<2; 14 - Hurra!; val it = [0,1,2] : int list val it = [1,2,,4] : int list Error: operator and operand don t agree val it = [1,2,] : int list val it = "INF110 er moro" : string val it = [,2,1] : int list val plussto = fn : int -> int valit=~:int valit=~:int val it = fn : int -> int valit=1004:int valit=false:bool valit=true:bool Error: unbound variable or constructor: Hurra 1/1 Forelesning.9.200 Forelesning.9.200 2/1 Oppvarming og repetisjon Rekursjon over lister: 1 - fun finn(x:int, ls:int list) = 2 case ls of [] => false y :: resten => x = y orelse finn(x,resten); 4 val finn = fn : int * int list -> bool Alternativt: 1 - fun finn(x:int, []:int list) = false 2 finn(x:int, (y :: resten):int list) = x = y orelse finn(x,resten); 4 val finn = fn : int * int list -> bool Smart typeanalyse Følgende deklarasjoner forstås likt av ML: 1 - fun dobbel(x:int) = x+x; (* vi spesifiserer typen til argumentet *) 2 - fun dobbel(x):int = x+x; (* vi spesifiserer typen til resultatet *) - fun dobbel(x:int):int = x+x; (* vi spesifiserer begge deler *) 4 - fun dobbel(x) = x+x; (* vi spesifiserer ikke noe *) I alle tilfellene kvitterer ML med 1 val dobbel = fn : int -> int ML kan dedusere typen av funksjonsverdien og/eller (utypede) parametre, så sant en éntydig løsning finnes. 1 - fun id(x) = x; 2 val id = fn : a -> a Her står a for en vilkårlig type. Dvs. funksjonen er polymorf, den kan brukes for alle typer. Forelesning.9.200 /1 Forelesning.9.200 4/1

Evalueringsmekanismen i ML Hvis ML skal regne ut plussto(<uttrykk>), så må først <uttrykk> regnes ut! 1 - fun fak(n:int) = if n < 2 then 1 else n * fak(n-1); 2 val fak = fn : int -> int - fak(); 4 valit=6:int 5 -fak4; 6 valit=24:int Hvordan regnes dette ut? fun fak(n:int) = if n < 2 then 1 else n * fak(n-1); 1 fak(4) => 4 * fak(4-1) 2 => 4 * fak() => 4 * ( * fak( - 1)) 4 => 4 * ( * fak(2)) 5 =>4*(*(2*fak(2-1)) 6 =>4*(*(2*fak(1))) 7 =>4*(*(2*1)) =>4*(*2) 9 =>4*6 10 => 24 Denne funksjonen bruker unødvendig mye plass. Forelesning.9.200 5/1 Forelesning.9.200 6/1 Et forslag som bruker mindre plass: 1 - fun fakti(n:int, r:int) = 2 if n < 2 then r else fakti(n-1, r*n); val fakti = fn : int * int -> int 1 fakti(4,1) => fakti(4-1, 1 * 4) 2 => fakti(, 4) =>fakti(-1,4*) 4 => fakti(2, 12) 5 =>fakti(2-1,12*2) 6 => fakti(1, 24) 7 => 24 Denne er halerekursiv eller iterativ. Gode kompilatorer finner ut av når en funksjon er halerekursiv. Merk: Ikke programmer slik bortsett fra når plass er essensielt! Typedeklarasjoner Deklarasjon av en type med navn T uten parametre: type/datatype T = <type-uttrykk>; 1 type tall = int; 2 type talliste = tall list; Deklarasjon av en type med navn T og med parametre: type/datatype <typeparametre> T = <type-uttrykk>; 1 type mintype par = mintype * mintype; (* mer om produkttyper på side 10 *) 2 type intpar = int par; type boolpar = bool par; Merk: Navnet på en typeparameter må starte med en apostrof. par blir her en typekonstruktør. Forelesning.9.200 7/1 Forelesning.9.200 /1

med navngitte komponenter - record 1 - type Person = {navn:string, alder:int}; 2 type Person = {alder:int, navn:string} 4 - val Ole = {navn="ole", alder= 25}; 5 val Ole = {alder=25,navn="ole"} : 6 {alder:int, navn:string} 7 - #navn Ole; 9 val it = "Ole" : string 10 11 - #alder Ole; 12 valit=25:int med navnløse komponenter - tuple 1 - type Person = string * int; 2 type Person = string * int 4 - val Ole = ("Ole", 25); 5 val Ole = ("Ole", 25) : string * int 6 7 -#1Ole; val it = "Ole" : string 9 10 -#2Ole; 11 valit=25:int; Forelesning.9.200 9/1 Forelesning.9.200 10/1 Uniontyper i ML: datatyper Tomt produkt unit Typen unit står for et tomt produkt. Denne typen er predefinert, og har bare én mulig verdi, nemlig (). Denne verdien kan også skrives som {}. 1 - (); 2 val it = () : unit - () = {}; 4 valit=true:bool 1 - datatype PersonData = navn of string alder of int; 2 datatype PersonData = alder of int navn of string - val n = navn("ole"); 4 val n = navn "Ole" : PersonData 5 - val a = alder(25); 6 val a = alder 25 : PersonData Både n og a er lovlige, men ulike, verdier av typen PersonData. Ved case-uttrykk kan man analysere PersonData-verdier: case x of navn(s) =>...s... alder(i) =>...i... der x er et uttrykk av type PersonData. Forelesning.9.200 11/1 Forelesning.9.200 12/1

1 - fun inc_alder(x:persondata) = 2 case x of navn(s) => x alder(i) => alder(i+1); 4 val inc_alder = fn : PersonData -> PersonData 5 6 - val n = navn("ole"); 7 val n = navn "Ole" : PersonData 9 - val a = alder(25); 10 val a = alder 25 : PersonData 11 12 - inc_alder(n); 1 val it = navn "Ole" : PersonData 14 15 - inc_alder(a); 16 val it = alder 26 : PersonData Konstanter som alternativer Et alternativ kan også være en konstant, for eksempel: 1 datatype Dag = 2 mandag tirsdag onsdag torsdag fredag lordag sondag; 4 fun ukedag(d:dag):bool= 5 case d of lordag => false 6 sondag => false 7 _ => true; 9 - ukedag(mandag); 10 valit=true:bool 11 12 - ukedag(lordag); 1 valit=false:bool Forelesning.9.200 1/1 Forelesning.9.200 14/1 1 - datatype Data = tall of int no; 2 datatype Data = no tall of int 4 - tall(5); 5 val it = tall 5 : Data 6 - no; 7 valit=no:data 9 - fun dobbel(x:data):data = 10 case x of tall(i) => tall(i+i) 11 no => no; 12 val dobbel = fn : Data -> Data 1 14 - dobbel(tall(5)); 15 valit=tall10:data 16 - dobbel(no); 17 valit=no:data Rekursive Typer datatype T =...... T... liste av tall 1 - datatype TallListe = tom leggtil of int * TallListe; 2 datatype TallListe = leggtil of int * TallListe tom 4 - leggtil(1,leggtil(2,leggtil(,tom))); 5 val it = leggtil (1,leggtil (2,leggtil #)) : TallListe Forelesning.9.200 15/1 Forelesning.9.200 16/1

Pass på! Uendelige datatyper i ML 1 - datatype DumType = dum of int * DumType; 2 datatype DumType = dum of int * DumType - fun makedum(x:int):dumtype = dum(x,makedum(x)); 4 val makedum = fn : int -> DumType Hva skjer ved kallet makedum(1);? 1 makedum(1) 2 => dum(1, makedum(1)) => dum(1, dum(1, makedum(1))) 4 => dum(1, dum(1, dum(1, makedum(1)))) 5 => dum(1, dum(1, dum(1, dum(1, makedum(1))))) Terminerer ikke! En rekursiv datatype må ha minst ett ikke-rekursivt/terminerende alternativ! Rekursive datatyper med parametre Lister av vilkårlig type elem: 1 - datatype elem Liste = tom leggtil of elem * elem Liste; MLs egen liste-definisjon: 1 - datatype elem list = nil :: of elem * elem list; Merk at :: er en infiks operator, mens leggtil er prefiks. leggtil kan gjøres til infiks ved å bruke infix slik: 1 - infix leggtil; 2 infix leggtil - "test" leggtil tom; 4 val it = "test" leggtil tom : string Liste Forelesning.9.200 17/1 Forelesning.9.200 1/1