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



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

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.

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

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

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

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

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

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

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

INF2810: Funksjonell Programmering. En metasirkulær evaluator

INF2810: Funksjonell Programmering. En metasirkulær evaluator

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

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

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

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

TDT Øvingsforelesning 1. Tuesday, August 28, 12

UNIVERSITETET I OSLO

Semantisk Analyse del I

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

Anatomien til en kompilator - I

Beskrivelse av programmeringsspråket Simpila INF Kompilatorteknikk Våren 2012

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

Utførelse av programmer, metoder og synlighet av variabler i JSP

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

Diverse eksamensgaver

UNIVERSITETET I OSLO

Høyere-ordens prosedyrer

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

{(1,0), (2,0), (2,1), (3,0), (3,1), (3,2), (4,0), (4,1), (4,2), (4,3) } {(1,0), (1,1), (1,2), (1,3), (2,0), (2,2), (3,0), (3,3), (4,0)}

MAT1030 Diskret matematikk

Programmeringsspråk for nybegynnere. Krav til språket. Krav til språket. Krav til språket

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

Øvingsforelesning TDT4105 Matlab

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

INF2810: Funksjonell Programmering. Kommentarer til prøveeksamen

Skal bindes opp til en deklarasjon av samme navn

Kap 6.3: Symboltabellen Foiler ved Birger Møller-Pedersen Forelest av Stein Krogdahl 17. mars Dagens tema:

Eksamen i emne TDT4165 / SIF8028 Programmeringsspråk

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF2810: Funksjonell Programmering. Mer om strømmer

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

INF2810: Funksjonell Programmering. Tilstand og verditilordning


INF2810: Funksjonell Programmering. Mer om strømmer

MAT1030 Plenumsregning 1

TDT4165 PROGRAMMING LANGUAGES. Exercise 01 Introduksjon til Oz

INF Repetisjon: Hvordan bygge treet og analysere? 8. september Typisk situasjon. De problematiske syntaks-diagrammene

Python: Valg og betingelser. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Runtimesystemer - II. Funksjoner som parametere. Virtuelle metoder

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon

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

Skal bindes opp til en deklarasjon av samme navn

INF109 - Uke 1b

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

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

MAT1030 Diskret Matematikk

Oversikt. INF1000 Uke 3. Repetisjon Program. Repetisjon Program. Litt repetisjon Program Variabler og Uttrykk Presedens Matematiske funksjoner

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

LISP PVV-kurs 25. oktober 2012

Løsningsforslag EKSAMEN

INF Seminaroppgaver til uke 3

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

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

KAPITTEL 3 Litt logikk og noen andre småting

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

Lynkurs i shellprogrammering under Linux

Løsningsforslag Øving 7 TMA4140 Diskret matematikk Høsten 2008

Anatomien til en kompilator - I

UNIVERSITETET I OSLO

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

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

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap. 3

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

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

if (be): else (not_to_be): TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap.

Dagens tema Innføring i ML - del IV

MAT1030 Diskret Matematikk

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

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

Eksamen i SLI230, vår 2003.

Øvingsforelesning TDT4105 Matlab

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

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning

Leksjon 3. Kontrollstrukturer

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

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

INF2810: Funksjonell Programmering. Tilstand og verditilordning

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

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

Høst Øving 5. 1 Teori. 2 Månedskalender. Norges teknisknaturvitenskapelige universitet Institutt for datateknikk og informasjonsvitenskap

MAT1030 Diskret matematikk

Transkript:

1 Kap.4 Funksjoner Tre viktig ting ifm. funksjoner: navn parameter (input) oppskrift (body) for å beregne resultat (output) Syntaks: <name> <parameter> = <body> Deklarerte funksjoner kan brukes i uttrykk (prefiks, høyest presedens)

2 Eksempler successor n = n+1 successor (n) = n+1 abs(n) = if n >= 0 then n else -n len l = if null l then 0 else 1 + len tail l (* feil *) len l = if null l then 0 else 1 + len (tail l) fib n = if n == 0 n == 1 then 1 else fib (n-1) + fib (n-2)

3 Evaluering av uttrykk Gitt en funksjon <name> <parameter> = <body> Innerst (innermost) evaluering av <navn>(<actual-par>) evaluer (<actual-par>) til en verdi sett inn verdien for <parameter> i <body> evaluer det resulterende uttrykket <valued-body> Ytterst (outermost) evaluering av <navn>(<actual-par>) sett inn uttrykket <actual-par> for <parameter> i <body> evaluer det resulterende uttrykket <actual-body>

4 Eksempler på evaluering Gitt en funksjon successor n = n+1 Innerst (innermost) evaluering av successor (3+2) evaluer 3+2 til 5 sett inn 5 for n i n+1 evaluer det resulterende uttrykket 5+1 Ytterst (outermost) evaluering av successor(3+2) sett inn uttrykket 3+2 for n i n+1 evaluer det resulterende uttrykket (3+2)+1

5 Fordeler og ulemper Innermost = call-by-value enkelt og naturlig kan evaluere unødvendig: fst(1,1 div 0) Outermost = lazy evaluation finner alltid en verdi hvis det eksisterer en kan gjøre dobbelt arbeid: double x = x + x double (2*3) Haskell bruker lazy evaluation

6 McCarthy s 91-funksjon Eksempel på rekursjon, se her Definisjon: f x = if x > 100 then x-10 else f (f (x+11) ) Vanskelig å forstå operasjonelt Lettere å forstå deklarativt: x > 100 f(x) = x 10, spesielt f101 = 91 90 x 100 x + 11 > 100 f(x) = f(x + 11 10) = f(x + 1) =... = f101 = 91 79 x 89 90 x + 11 100, faktisk fx = 91 for alle x 100 Innermost og outermost evaluering på tavla

Konfluens I alle rene funksjonelle språk (pure FP) gjelder det at enhver evalueringsstrategi som finner en verdi til et gitt uttrykk, finner samme verdi. Det er ikke mulig at to evalueringer av samme uttrykk finner forskjellige verdier. Det som er mulig er at en strategi finner en verdi mens en annen strategi ikke finner noen verdi. 7

8 Rekkevidde For å kunne evaluere et uttrykk må hver variabel være bundet Å binde en variabel skjer f.eks. ved bruk av let Rekkevidde (scope) til en bundet variabel er deluttrykket hvor bindingen gjelder Eksempler let x=3 in <u>, scope til x er <u> let x=3 in let y=2 in x+y : scope til x er rød, scope til y er x+y let x=3 in let y=x in <u> : scope til x er rød, scope til y er <u> let x=3 in y+1: feil?

9 Rekkevidde (forts.) successor n = n+1, rød scope til n successor x = x+1, rød scope til x Bundete variabler: navn urelevant (men...) Obs: også successor er en bundet variabel (blå scope) let successor n = n+1 in successor 4 let etterfoelger x = x+1 in etterfoelger 4

10 Flere eksempler Rekursjon : let even n = n==0 even (n-2) in even 4 Samtidig rekursjon: let even x = if x==0 then True else if x==1 then False in else odd (x-1) odd x = if x==0 then False else if x==1 then True (even 24,odd 24) else even (x-1)

11 Typer Type-sjekking og type-avledning behandles dypere om noen uker Her legger vi bare frem noen type-fenomener Haskell klarer ofte å avlede en type til et uttrykk, med mindre 1. uttrykket er galt (oftest), eller 2. uttrykket er OK men meget komplisert (sjeldent) I det sjeldne tilfelle 2 skal man legge til noen type-informasjon

12 Strukturelle regler Hvis <u> :: Int og <v> :: Int, så <u> + <v> :: Int Hvis <u> :: <t l> og <v> :: <t r>, så (<u>,<v>) :: (<t l>,<t r>) Hvis <u> :: <t i> -> <t o> og <v> :: <t i>, så <u> <v> :: <t o> Disse tre henger sammen: (+) :: (Num a) => a -> a -> a Flere andre regler brukes til type-avledning

13 Type-ekvivalens Type-ekvivalens er likhet for typer, dvs. at hvis <u> :: <type> og <type> og <type > er ekvivalente, så <u> :: <type > Etter type Intpair = (Int,Int) er Intpair og (Int,Int) ekvivalente Så er også, f.eks., Intpair -> Bool og (Int,Int) -> Bool ekvivalente

14 Type-ekvivalens Formell definisjon: T og <type> er ekvivalente hvis type T = <type> Type-ekvivalens er refleksiv, symmetrisk og transitiv Hvis <type1> og <type2> er ekvivalente, så er [<type1>] og [<type2>] Hvis <t1> og <t2> er ekvivalente og <t 1> og <t 2> er ekvivalente, så er (<t1>,<t 1>) og (<t2>,<t 2>) ekvivalente og <t1>-><t 1> og <t2>-><t 2> ekvivalente

15 Mer om typer i Haskell Haskell tillater operator overloading: 1 + 2, 3.14 + 1.0 Haskell bruker type-klasser for tall: 2 * 3.14 :: (Fractional t) => t Haskell støtter polymorfi: len :: [a] -> Int len [] = 0 len (_:tl) = 1 + len tl (len [1,2]) + (len ["tre"])