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.

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

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

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

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 IV

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

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

Semantisk Analyse del III

INF3110 Programmeringsspråk. Dagens tema

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)

Programmeringsspråket C

Kap.4 Funksjoner. Tre viktig ting ifm. funksjoner: parameter (input) oppskrift (body) for å beregne resultat (output)

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

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

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];

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

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

Datatyper og typesjekking

Datatyper og typesjekking

Datatyper og typesjekking

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

Semantisk Analyse del I

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

UNIVERSITETET I OSLO

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

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

Datatyper og typesjekking

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

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

Ark 1 av 18. programmeringsspråkenes. Velkommen til IN 211. verden. IN 211 Programmeringsspråk

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

Velkommen til INF2100 Jeg er Dag Langmyhr

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

IN 211 programmeringsspråk H 99

Anatomien til en kompilator - I

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

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

Statisk semantisk analyse - Kap. 6

IN 147 Program og maskinvare

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

Dagens tema INF1070. Signaturer. Typekonvertering. Pekere og vektorer. struct-er. Definisjon av nye typenavn. Lister

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

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

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

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

Statisk semantisk analyse - Kap. 6

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Forelesning inf Java 5

Forelesning inf Java 5

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Eksamen i emne TDT4165 / SIF8028 Programmeringsspråk

Dagens tema INF1070. Vektorer (array er) Tekster (string er) Adresser og pekere. Dynamisk allokering

UNIVERSITETET I OSLO

Metoder med parametre, løkker og arrayer

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

Syntaksanalyse. Dagens tema: Språkdiagrammene Jernbanediagrammene er et ypperlig utgangspunkt for å analysere et program: INF2100 INF2100 INF2100

Programmering Høst 2017

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

Anatomien til en kompilator - I

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

UNIVERSITETET I OSLO

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

Blokker og metoder INF1000 (Uke 6) Metoder

INF1000 Metoder. Marit Nybakken 16. februar 2004

Dagens tema: INF2100. Syntaksanalyse. Hva annet gjør en kompilator? Sjekking av navnebruk. Testutskrifter

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

TDT Øvingsforelesning 1. Tuesday, August 28, 12

Fiktiv eksamensbesvarelse IN 211 høsten 2001

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Dagens tema: Sjekking

Eksamensrelevant repetisjonsstoff. Deklarasjoner og variabeltyper. Konstanter

UNIVERSITETET I OSLO

Signaturer. Dagens tema. En vanlig feil int-funksjon. Dette kan noen ganger gi rare feilmeldinger: INF1070 INF1070 INF1070 INF1070

Java-kurs. Andreas Knudsen Nils Grimsmo 9th October 2003

Del 3. Pekere RR 2016

Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2)

Dagens tema: Kjøresystemer II

Del 1 En oversikt over C-programmering

Litt om kompilering og interpretering. Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2) Syntaks og semantikk

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

INF1000: Forelesning 7

2 Om statiske variable/konstanter og statiske metoder.

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Kapittel 1 En oversikt over C-språket

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

Forelesere. Velkommen til programmeringsspråkenes verden IN211. Praktiske opplysninger. Faglige forutsetninger. Ragnhild Kobro Runde

Object interaction. Innhold. Abstraksjon Grunnleggende programmering i Java Monica Strand 3. september 2007.

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

INF Uke 10. Ukesoppgaver oktober 2012

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

Løsningsforslag til eksamen i INF1000 våren 2006

Lisp 2: Lister og funksjoner

2 Om statiske variable/konstanter og statiske metoder.

Transkript:

ML (kap 5 og 6) Variable i ML Nye datatyper Currying Avanserte listeoperatorer Typeanalyse Variable Man kan bruke variable i ML - val = ref 1; val = ref 1 : int ref - := 3*(!)+5; val it = () : unit -!; valit=8:int -; val it = ref 8 : int ref Notasjonen er: ref oppretter en variabel (kalt «referanse») med gitt initialverdi.! gir verdien i variabelen. r := v legger verdien v i variabelen. Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 1 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 2 av 22 Et eksempel på at variable er nyttige, er beregning av Fibonacci-numre. - fun fib (n) = if n<=1 then 1 else fib(n-1)+fib(n-2); val fib = fn : int -> int - fib(20); val it = 10946 : int - fib(40); val it = 165580141 : int - funfib2(n)=letvalf0=ref1andf1=ref1andi=ref1in while!i < n do ( let val temp =!f0 in f0 :=!f1; f1 :=!f1+temp; i := (!i)+1 end );!f1 end; val fib2 = fn : int -> int - fib2(20); val it = 10946 : int - fib2(40); val it = 165580141 : int Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 3 av 22 Nye datatyper Man kan definere nye datatyper i ML: - datatype colour = RED BLUE GREEN; datatype colour = BLUE GREEN RED - val grass = GREEN; val grass = GREEN : colour - grass = BLUE; val it = false : bool - fun norsk BLUE = "blå" norsk GREEN = "grønn" norsk RED = "rød"; val norsk = fn : colour -> string - norsk GREEN; val it = "gr\248nn" : string Noen liker å skrive konstruktørene med store bokstaver. Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 4 av 22

En datatype kan også inneholde data av andre typer: - datatype student = BACHELOR of string MASTER of string*real; datatype student = BACHELOR of string MASTER of string * real - val per = BACHELOR("Per Hansen"); val per = BACHELOR "Per Hansen" : student - val kari = MASTER("Kari Holm", 1.3); val kari = MASTER ("Kari Holm",1.3) : student - fun navn(bachelor(n)) = n navn(master(n,d)) = n; val navn = fn : student -> string - navn kari; val it = "Kari Holm" : string Man kan tenke på verdier av datatyper som funksjonskall som ikke evalueres. Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 5 av 22 Man kan også bruke rekursive definisjoner av datatyper: - datatype tre = BLAD of int NODE of (tre*tre); datatype tre = BLAD of int NODE of tre * tre - val busk = NODE(NODE(BLAD(3),BLAD(17)), BLAD(~4)); val busk = NODE (NODE (BLAD #,BLAD #),BLAD ~4) : tre Man kan også lage funksjoner av disse datatypene - fun itreet (, BLAD(b)) = =b itreet (, NODE(a,b)) = itreet(,a) orelse itreet(,b); val itreet = fn : int * tre -> bool - itreet(1, busk); val it = false : bool - itreet(17, busk); val it = true : bool Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 6 av 22 Avansert bruk av funksjoner Følgende er to alternativer måter å se på en funksjon med to parametre på: f : int int int g : int (int int) Fordelen med den siste formen er at den kan evalueres delvis: g(5) Dette kalles curry-ing etter logikeren Haskell Curry. - fun sum (a,b) = a + b; val sum = fn : int * int -> int - sum(3,12); val it = 15 : int - fun sum a b = a + b; val sum = fn : int -> int -> int - sum 3 12; val it = 15 : int - val sum5 = sum 5; val sum5 = fn : int -> int - sum5 ~2; valit=3:int Egentlig var det Moses Schönfinkel som fant på dette først. Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 7 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 8 av 22 - val data = [ 3, ~17, 4, 8, ~6]; val data = [3,~17,4,8,~6] : int list - fun double = 2*; val double = fn : int -> int - map double data; val it = [6,~34,8,16,~12] : int list - fun mymap f nil = nil mymap f (::r) = f()::(mymap f r); val mymap = fn : ( a -> b) -> a list -> b list - mymap double data; val it = [6,~34,8,16,~12] : int list map Denne funksjonen appliserer en funksjon på elementene i en liste. Fire spesielle funksjoner De fleste funksjonelle språk har fire nyttige høynivåfunksjoner.

filter Denne funksjonen plukker ut de elementene i en liste som tilfredsstiller visse krav. - val data = [ 3, ~17, 4, 8, ~6]; val data = [3,~17,4,8,~6] : int list - funeven=mod2=0; val even = fn : int -> bool - fun filter f nil = nil filter f (::r) = if f() then ::(filter f r) else filter f r; val filter = fn : ( a -> bool) -> a list -> a list - filter even data; val it = [4,8,~6] : int list - filter (fn => >=0) data; val it = [3,4,8] : int list Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 9 av 22 fold Denne funksjonen «setter inn» en operator mellom elementene i en liste slik at fold(+, [a1, a2, a3,...,an]) = a1 + a2 + a3 + an - val data = [ 3, ~17, 4, 8, ~6]; val data = [3,~17,4,8,~6] : int list - fun sum (, y) = + y; val sum = fn : int * int -> int - fun fold f nil = 0 fold f (::nil) = fold f (::r) = f(,fold f r); val fold = fn : (int * int -> int) -> int list -> int - fold sum data; val it = ~8 : int - fold (fn (a,b) => a*b) data; val it = 9792 : int - fun ma2 (,y) = if >=y then else y; val ma2 = fn : int * int -> int - fold ma2 data; valit=8:int - Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 10 av 22 Sammensetning Man kan slå to funksjoner sammen til én: - fun double () = 2*; val double = fn : int -> int - fun incr5 () = +5; val incr5 = fn : int -> int - valf=doubleoincr5; valf=fn:int->int -f(1); val it = 12 : int - valg=incr5odouble; valg=fn:int->int -g(1); valit=7:int -val times8 = double o double o double; val times8 = fn : int -> int - times8(10); val it = 80 : int Typer Hvorfor har vi typer? For å skille mellom funksjoner: 3+4 3.0+4.0 For å sikre mot programmeringsfeil: a + 3.14 For å strukturere programmeringen: Dato idag = new Dato(25, 10, 2004); Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 11 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 12 av 22

Ulike arter typing i språk Utypete språk Assemblerspråk/maskinspråk er de eneste utypete språk: ld.w add.s R1,var1 R1,#1 Typesikkerhet Noe språk mangler typesikkerhet, for eksempel C: short endian = 1; if (*(char*)&endian == 0)... Andre språk er «nesten sikre», som Pascal: int *p; new(p); *p = 3; free(p); *p = 5; Men mange språk er heldigvis typesikre: ML, Java, Perl,... Felles for disse er at de har søppeltømming. printf("%d", 3.14); Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 13 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 14 av 22 Typesjekking under kompilering og kjøring Noen språk har statisk typing (er sterkt typet); da er alle typer kjent under kompileringen. Eksempler er ML, C og Pascal. Fordeler: Raskere kode Typeanalyse De fleste språk er basert på ren «bottom up»-analyse av typer: a = f(3.14, g("tt", 17, p-2)); Noen tillater overlasting som Java: int f () {... } int f (int ) {... } int f (Dato ) {... } Finner alle typefeil Andre språk har dynamisk typing der typen først er kjent under kjøringen; eksempler er Lisp og Perl. De øvrige har en mellomting: Java er statisk typet med unntak av sub-klasser (og array-indekser). Noen (som Ada) tillater også å la returtypen spille inn: function f (int a): int... function f (int a): char... Verste tabbe IAlgol-60er i^n { int om n 0 real om n < 0 Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 15 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 16 av 22

Typeanalyse i ML ML er i stand til å foreta en avansert analyse av uttrykkene og finne ut hvilken type de må være. Dette forklares enklest med et par eksempler. Først litt om notasjonen brukt i læreboken: Et funksjonskall f() tegnes slik: Funksjoner fn() =... angis med lambdauttrykk λ.(...) tegnes slik: λ f... Infiksoperatorer angis med currying: 5 + +5() + 5 med angivelse av hvor variabelen er deklarert. Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 17 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 18 av 22 Sett på typenavn på alle nodene: λ :r Funksjon med parameter Anta at vi har definisjonen - fung()=5+; valg=fn:int->int Tegn parseringstreet: :s :t :u + :v 5 :w λ + 5 Så kan vi begynne å utlede: 5 int + int int int λ :r :s :t :u + 5 :int int int int Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 19 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 20 av 22

En polymorf funksjon Anta at vi har denne funksjonen - fun apply (f, ) = f(); val apply = fn : ( a -> b) * a -> b Den kan tegnes slik: λ Vi kan nå foreta typeanalysen: λ :r t u :s f :t :u f Utledning t u s r t u s (u s) u s u a s b Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 21 av 22 Dag Langmyhr,Ifi,UiO: Forelesning 25. oktober 2004 Ark 22 av 22