Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avÅsa Lind
1
2002-12-06F. Drewes, Inst. f. datavetenskap1 Föreläsning 11: Funktionella språk Funktioner och variabler i matematiken Funktionella språk LISP, ML och HASKELL Lat evaluering
2
2002-12-06F. Drewes, Inst. f. datavetenskap2 Om funktioner (välbekanta fakta!?) A är funktionens domän och B är dess värdemängd Funktionens värde för ett argument a A noteras som f(a) och är det b som uppfyller (a,b) f Värdet kan vara odefinierat (om b inte existerar) men inga flertydigheter kan förekomma Om f(a) alltid är definierat är f total, annars är den partiell Låt A och B vara mängder. En (partiell) funktion f:A B är en delmängd i A B så att det, för varje a A, finns max ett b B där (a,b) f.
3
2002-12-06F. Drewes, Inst. f. datavetenskap3 Matematisk funktionsdefinition Uttryck, falldistinktion och rekursion är de vanligaste hjälpmedlen som används för att definiera funktioner I matematiken är sättet på vilket en funktion f definieras absolut irrelevant så länge definitionen är exakt (och f faktiskt är en funktion enligt den generella definitionen). fib(n) = nom n 1 fib(n 1) + fib(n 2)annars Exempel: Fibonacci-funktionens definition
4
2002-12-06F. Drewes, Inst. f. datavetenskap4 Variablernas roll i matematiken En variabel som t.ex. n i fib(n) = … är en platshållare för ett godtyckligt men fast värde (dvs. n står för samma värde överallt i definitionen). Definitionen ska läsas ut "För alla n gäller fib(n) = …". (Jämför med imperativa programspråk där en variabel står för ett specifikt men föränderligt värde!) Det finns inget begrepp om något yttre tillstånd som kan påverka resultatet – under alla omständigheter är fib(6) lika med 8. Den här egenskapen kallas referensiell genomskinlighet (eng. referencial transparency)
5
2002-12-06F. Drewes, Inst. f. datavetenskap5 Funktionella språk Variabler har ha samma karaktär som i matematiken Om uttryckens värde inte påverkas av kontexten är språket referensiellt genomskinligt eller rent funktionellt ( inga som helst sidoeffekter) Referensiell genomskinlighet förenklar språkets semantik betydligt (därför att definitionen inte behöver ta hänsyn till ett dynamiskt föränderligt tillstånd) Med funktionella språk försöker man överföra det mate- matiska funktionsbegreppet till programmeringen. Språken kallas för applikativa programspråk: För att få resultat utvärderas uttryck bestående av funktionsapplikationer.
6
2002-12-06F. Drewes, Inst. f. datavetenskap6 Funktionella språk (2) Viktiga ingredienser i ett funktionellt språk är ofta ett begrepp om (och notation för) funktionsapplikation några primitiva datatyper och funktioner tillsammans med en möjlighet att kombinera funktioner till nya att betrakta funktioner som vanligt data (funktioner är "first-class citizens") funktioner kan vara in- och utdata till andra funktioner, såkallade högre ordningens funktioner (eng. higher-order function eller functional form), t.ex. komposition ' ':h = f g h(x) = f(g(x)) kombination '[…]':h = [f 1,…,f k ] h(x)= (f 1 (x),…,f k (x)) iteration 'map':h = map f h(x 1 …x k ) = f(x 1 )…f(x k )
7
2002-12-06F. Drewes, Inst. f. datavetenskap7 Det äldsta funktionella språket: LISP LISP utvecklades kring 1960 av McCarthy och kan betraktas som en programspråksvariant av -kalkylen Till skillnad från imperativa språk syftar LISP inte på numeriska utan på symboliska beräkningar Listan (över symboler och listor) var den enda datatypen uttryck, funktioner, … representeras som listor Den universella funktionen EVAL som McCarthy skrev i LISP utvärderar LISP-uttryck; dess implementation blev den första LISP-interpretatorn Interpretatorn använder sig av read-eval-print-loopen som sedan dess blivit del av många interpretatorer
8
2002-12-06F. Drewes, Inst. f. datavetenskap8 ML och HASKELL ML och HASKELL är (betydligt) nyare och påminner syntaktiskt mer om andra programspråk Semantiska fördelar jämfört med LISP typer och typdeklarationer typinferens strikt typisering möjlighet att definiera (parametriserade) ADT:er Viktigaste skillnader mellan ML och HASKELL ML tillåter att programmera i en imperativ stil medan HASKELL är referensiellt genomskinligt (inga sidoeffekter) MLs evalueringsstrategi är strikt (eng. eager evaluation) medan HASKELLs är lat (eng. lazy evaluation)
9
2002-12-06F. Drewes, Inst. f. datavetenskap9 Lat evaluering Vid lat evaluering kan oändliga datastrukturer användas: Lat evaluering utvärderar endast de deluttryck vars värde behövs för att komma fram till resultatet. primes n | isPrime n = n : primes (n + 1) | otherwise = primes (n + 1) primesquares = map (^2) (primes 0) isPrimesquare = memberOf primesquares memberOf (elem:rest) n | elem < n = memberOf rest n | elem == n = True | otherwise = False
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.