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

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

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

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.

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

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)

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: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

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

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

Programmeringsspråket C

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

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

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

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

Del 3: Evaluere uttrykk

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

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

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

Introduksjon til objektorientert programmering

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

INF3110 Programmeringsspråk. Velkommen til kurset INF 3110/4110. Programmeringsspråk 1/24

INF 3110/4110. Velkommen til kurset. Programmeringsspråk. Først det praktiske

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

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

INF2810: Funksjonell Programmering

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

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

INF2810: Funksjonell Programmering

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

INF 1000 høsten 2011 Uke september

UNIVERSITETET I OSLO

INF1000 undervisningen INF 1000 høsten 2011 Uke september

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

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

INF2810: Funksjonell Programmering

Programmering Høst 2017

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

UNIVERSITETET I OSLO

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

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

Dagens tema Grundig repetisjon og utdyping: Syntaks kontra semantikk

Semantisk Analyse del III

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

INF2810: Funksjonell Programmering

Hva er syntaks? En overskrift i en norsk avis: Dagens tema Grundig repetisjon og utdyping:

Rekker (eng: series, summations)

Kapittel 1 En oversikt over C-språket

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon

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

Velkommen til INF2100 Jeg er Dag Langmyhr

IN 211 programmeringsspråk H 99

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

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

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

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

UNIVERSITETET I OSLO

Semantisk Analyse del I

TDT4110 IT Grunnkurs Høst 2016

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

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

Rekursjon. Binærsøk. Hanois tårn.

Del 4 Noen spesielle C-elementer

156C. Algoritmer og maskinspråk. IT1101 Informatikk basisfag. Maskinspråk: det maskinen forstår. Assembler / assemblerspråk

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

Notat 2, ST Sammensatte uttrykk. 27. januar 2006

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

Norsk informatikkolympiade runde

Datatyper og typesjekking

IN 147 Program og maskinvare

Datatyper og typesjekking

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre, anders}@idi.ntnu.

Dagens tema: Kjøresystemer II

Rekker (eng: series, summations)

Fiktiv eksamensbesvarelse IN 211 høsten 2001

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

Ta kontakt i pausen. Viktig at vi kommer i gang med dette arbeidet!

UNIVERSITETET I OSLO

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

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

Et lite oppdrag i bakgrunnen

TDT4105 IT Grunnkurs Høst 2016

Høyere-ordens prosedyrer

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

Velkommen til. INF våren 2016

Datatyper og typesjekking

Dagens tema. Perl: Mer om regulære uttrykk Filer Lister og tabeller Kompilering og interpretering (kapittel ) IN 211 Programmeringsspråk

IN uke 2. Presis forståelse av programmering

Løsningsforslag ukeoppg. 3: sep (INF Høst 2011)

Anbefalt litteratur: Pensum-bøker: Forelesere: Velkommen til INF Introduksjon til operativsystemer og datakommunikasjon

Betinget eksekvering og logiske tester i shell

Velkommen til INF Introduksjon til operativsystemer og datakommunikasjon

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

Typisk: Kan det være både nøkkelord og navn, så skal det ansees som nøkkelord

Endret litt som ukeoppgave i INF1010 våren 2004

TDT4110 IT Grunnkurs Høst 2016

Transkript:

ML (kap 5) Bakgrunn Litt historikk Funksjonelle språk (kap 4.4) Bakgrunnen for ML Programmeringsspråket ML Hvordan kjøre ML-programmer Enkle uttrykk Deklarasjoner Funksjoner Datatyper Mønstre Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 1 av 20

1. generasjons språk Data var statisk: alle variable eksisterte under hele kjøringen. Eksempler: Fortran, Cobol, Basic. Funksjoner: Kun faste funksjoner. Ikke rekursive kall. 2. generasjons språk Blokker ga lokale variable og rekursive kall. Eksempler: Algol-60 (med BNF). Funksjoner: Funksjoner som parametre. 3. generasjons språk Egendefinerte datatyper. Eksempler: Simula (objektorientert programmering), C, Java, Pascal. Funksjoner: C med pekere til funksjoner, for eksempel void (*signal (int sig, void (*disp)(int)))(int) Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 2 av 20

4. generasjons språk Fleksible datastrukturer (lister, tabeller); avanserte innebygde operasjoner (søking med regulære uttrykk). Eksempler: Perl. Funksjoner: Som for 3. gen. 5. generasjons språk Basert på ideer fra AI. Eksempler:?? Andre språk Funksjonelle språk: Lisp,... Grafiske språk, logiske språk,... Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 3 av 20

Hvorfor funksjonelle språk? Det er flere grunner: ❶ Ønsket om større fleksibilitet når det gjelder funksjoner: anonyme funksjoner, kunne lage nye funksjoner utifra andre. ❷ Mer generelle funksjoner (kunne returnere alle typer). ❸ Matematikerne likte dårlig tilordning. Få språk er rent funksjonelle. Lisp og ML er blandingsspråk men kalles funksjonelle. Men: Flere moderne algoritmiske språk (som Java og C#) har nå fått funksjonelle elementer. Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 4 av 20

Hvordan ble ML til? I Edinburgh på slutten av 1970-tallet jobbet man med automatisk bevis av teoremer og laget bevissystemet LCF («Logic for Computable Functions»). Dette ble programmert i ML («Meta Language»). Hovedmannen var Robin Milner. Vi kjører Standard ML of New Jersey utviklet av flere universiteter og forskningsinstitusjoner der. Informasjon finnes på //www.smlnj.org/; der finnes også nedlastbar kode. Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 5 av 20

Hvordan kjøre ML ML er i utgangspunktet et interaktivt språk: > sml Standard ML of New Jersey v110.49 [FLINT v1.5], September 13, 2004 - "Hallo, alle sammen."; val it = "Hallo, alle sammen." : string - Ctrl + D Man kan også oppgi en fil med ML-kode: > more tall.sml (5+3)-2; 1+2+3+4+5; > sml tall.sml Standard ML of New Jersey v110.49 [FLINT v1.5], September 13, 2004 [opening tall.sml] valit=6:int val it = 15 : int - Ctrl + D Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 6 av 20

Følgende gjelder: ML leser uttrykk og utfører dem direkte. Så skrives svaret ut (med typeangivelse). Alle uttrykk avsluttes med semikolon. - (~5+7)-2; valit=0:int -(1+ ~2)*(4+5); val it = ~9 : int - 100 div 3; val it = 33 : int - 100 mod 3; valit=1:int -24.0 / 2.5; (* Use / for reals *) val it = 9.6 : real Tegnet ~ er en unær minus mens er binær (dvs for subtraksjon). div og mod brukes på heltall mens / er for flyt-tall. Man kan ikke blande hel- og flyt-tall; de må konverteres med real eller floor. Kommentarer skrives i (* *). Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 7 av 20

Deklarasjoner Nye konstanter defineres med val: - val x = 7+2; valx=9:int -valy=x+3; valy=12:int -valz=x*y-(xdivy); val z = 108 : int - x+y+z; val it = 129 : int Løse uttrykk definerer konstanten it. NB! Konstanter kan aldri endre verdien. - valpi=3.14; val pi = 3.14 : real - fun omkrets (r) = 2.0 * pi * r; val omkrets = fn : real -> real - omkrets(33.0); val it = 207.24 : real - val pi = 3.14159265; val pi = 3.14159265 : real - omkrets(33.0); val it = 207.24 : real - Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 8 av 20

Lokale definisjoner Man kan definere lokale konstanter med let: fun findroot (a, x, acc) = let val next_x = (a/x+x)/2.0 in if abs(x-next_x) < acc*x then next_x else findroot(a, next_x, acc) end; fun sqrt (x) = findroot(x, 1.0, 1.0E~10); (* Heron s formula for area of triangle: *) fun areal (a, b, c) = let val s = (a+b+c)/2.0 in sqrt(s*(s-a)*(s-b)*(s-c)) end; areal(1.0, 1.0, 1.0); areal(3.0, 4.0, 5.0); Kjøring gir: Standard ML of New Jersey v110.49... [opening let1.sml] val findroot = fn : real * real * real -> real val sqrt = fn : real -> real val areal = fn : real * real * real -> real val it = 0.433012701892 : real val it = 6.0 : real - Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 9 av 20

Funksjoner Funksjoner defineres med fun: - funf(x)=x+5; valf=fn:int->int -f(2); valit=7:int -f(f(0)); val it = 10 : int - valg=fnx=>x-2; valg=fn:int->int -g(2); valit=0:int -f(g(0)) = g(f(0)); val it = true : bool fn er en funksjonstype som kan brukes til å angi en anonym funksjon. Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 10 av 20

Datatyper Heltall De velkjente tallene med de vanlige operatorene: +,, *, div og mod. Flyt-tallene De like velkjente tallene med sine operatorer: +,, * og /. Tekster Typen string er for tekster; tekstkonstanter skrives med doble anførselstegn. Operatorer er ^ skjøter tekster. size gir antall tegn i teksten. - val navn = "langmyhr"; val navn = "langmyhr" : string - size navn; valit=8:int -val fullt_navn = "dag" ^ " " ^ navn; val fullt_navn = "dag langmyhr" : string - size fullt_navn; val it = 12 : int Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 11 av 20

Logiske verdier Typen bool har to verdier: false og true. Man kan teste logiske verdier med if e1 then e2 else e3 Testene, og skrives not, andalso og orelse. De beregner ikke sine parametre unødvendig. - fun equiv(x,y) = (x andalso y) orelse ((not x)andalso(not y)); val equiv = fn : bool * bool -> bool - equiv(true,false); val it = false : bool - fun e2(x,y) = if x then y else not y; val e2 = fn : bool * bool -> bool - equiv(false,true); val it = false : bool Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 12 av 20

Par, tripler, n-tupler Tupler er vilkårlige samlinger av verdier som kan være av ulike typer. - (3,4); valit=(3,4):int*int -(4,5,true); val it = (4,5,true) : int * int * bool - val beatles = ("John", "Paul", "George", "Ringo"); val beatles = ("John","Paul","George","Ringo") : string * string * string * string - #3 beatles; val it = "George" : string - #2(3,4); valit=4:int -(); val it = () : unit #n brukes til å plukke frem et gitt element i tuplet. () har typen unit og brukes som «ingen type» (tilsvarende void i C). Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 13 av 20

Poster Poster («records») ligner på tupler, men elementene er navngitt. - val guru = {fornavn="donald", initial="e", etternavn="knuth"}; val guru = {etternavn="knuth",fornavn="donald",initial="e"} : {etternavn:string, fornavn:string, initial:string} - #initial guru; val it = "E" : string - #fornavn guru = #etternavn guru; val it = false : bool - {}; val it = () : unit Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 14 av 20

Lister Lister er den viktigste datastrukturen i ML. Alle elementene i en liste har samme type. nil er den tomme listen. - [1,2,3,4]; val it = [1,2,3,4] : int list - [true, false]; val it = [true,false] : bool list - ["red", "yellow", "blue"]; val it = ["red","yellow","blue"] : string list - [fn x => x+1, fn x => x+2]; val it = [fn,fn] : (int -> int) list - nil; val it = [] : a list (Notasjonen a betegner en generell type.) Listeoperasjoner Nye elementer kan legges inn først i listen med ::. To lister kan skjøtes med @. - val a = [1, 2, 3]; val a = [1,2,3] : int list - valb=0::a; val b = [0,1,2,3] : int list - a@b; val it = [1,2,3,0,1,2,3] : int list - 21 :: 22 :: 23 :: nil; val it = [21,22,23] : int list Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 15 av 20

Mønstre Hvordan plukker man fra hverandre en liste eller en post? Man kan bruke mønstre som er uttrykk med variable i stedet for verdier. - valt=(1,2,3); val t = (1,2,3) : int * int * int - val (x, y, z) = t; valx=1:int val y = 2 : int valz=3:int -val liste = [1, 2, 3, 4]; val liste = [1,2,3,4] : int list - val a :: b = liste; stdin:7.1-7.19 Warning: binding not exhaustive a :: b =... vala=1:int val b = [2,3,4] : int list - val halv = {teller=1, nevner=2}; val halv = {nevner=2,teller=1} : {nevner:int, teller:int} - val {teller=x, nevner=y} = halv; val y = 2 : int valx=1:int (Advarselen skyldes at a::b ikke virker for tomme lister.) Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 16 av 20

Funksjonsparametre Egentlig har funksjoner i ML bare én parameter, men den er et generelt mønster! - fun sum (x, y) = x+y; val sum = fn : int * int -> int - sum(2, ~4); val it = ~2 : int - fun f (x, (y,z)) = y; val f = fn : a * ( b * c) -> b - f("a", ("b","c")); val it = "b" : string - val par = (1, 2); val par = (1,2) : int * int - f(0, par); valit=1:int -fun g (x::y::z) = x::z; stdin:13.1-13.23 Warning: match nonexhaustive x :: y :: z =>... val g = fn : a list -> a list - g([1,2,3,4,5]); val it = [1,3,4,5] : int list - fun h {a=x, b=y, c=z} = {d=y, e=z}; val h = fn : {a: a, b: b, c: c} -> {d: b, e: c} - h{a="a", b="b", c="c"}; val it = {d="b",e="c"} : {d:string, e:string} Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 17 av 20

Dette kan vi bruke ved å lage flere utgaver av funksjonen med ulike variasjoner over mønsteret: - funf(x,0)=x f(0,y)=y f(x,y)=x+y; val f = fn : int * int -> int - f(0, 0); valit=0:int -f(0, 1); valit=1:int -f(1, 0); valit=1:int -f(1, 1); val it = 2 : int Men alle må passe med samme mønster: > sml Standard ML of New Jersey v110.49 [FLINT v1.5], September 13, 2004 - funf(x)=10*x = f (a,b) = a*b; stdin:1.13-1.17 Error: operator and operand don t agree [literal] operator domain: int * int operand: int * ( Z * Y) in expression: 10 * x Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 18 av 20

Et annet eksempel på hvor nyttige slike mønstre kan være er - fun length (nil) = 0 length (x::s) = 1+length(s); val length = fn : a list -> int - length([1,2,3]); valit=3:int -length [1,2]; valit=2:int Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 19 av 20

Programmering i ML Når man programmerer i ML, bør man huske følgende: Vi har ikke løkker, så bruk rekursjon i stedet. Vi har ikke variable så glem alt om variable som endres. Sett inn ekstra blanke rundt operatorene: > sml Standard ML of New Jersey v110.49 [FLINT v1.5], September 13, 2004 - val a = 3; vala=3:int -a=~3; stdin:2.2-2.4 Error: unbound variable or constructor: =~ stdin:2.1-2.5 Error: operator is not a function [tycon mismatch] operator: int in expression: a <errorvar> Dette er ikke helt sant se neste uke. Dette er heller ikke helt sant. Dag Langmyhr,Ifi,UiO: Forelesning 18. oktober 2004 Ark 20 av 20