120 likes | 235 Views
Föreläsning 11: Funktionella språk. Funktioner och variabler i matematiken Funktionella språk LISP (Scheme), ML och HASKELL Lat evaluering. Om funktioner (välbekanta fakta!?). A är funktionens domän och B är dess värdemängd
E N D
Föreläsning 11: Funktionella språk • Funktioner och variabler i matematiken • Funktionella språk • LISP (Scheme), ML och HASKELL • Lat evaluering Lennart Edblom, Frank Drewes, Inst. f. datavetenskap
Om funktioner (välbekanta fakta!?) • A är funktionens domän och B är dess värdemängd • Funktionens värde för ett argument aA 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 ftotal, annars är den partiell Låt A och B vara mängder. En (partiell) funktionf:A B är en delmängd i A B så att det, för varje aA, finns max ett bB där (a,b)f. Lennart Edblom, Frank Drewes, Inst. f. datavetenskap
Exempel: Fibonacci-funktionens definition n om n 1 fib(n1) + fib(n2) annars fib(n) = Matematisk funktionsdefinition • Uttryck, villkor 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). Lennart Edblom, Frank Drewes, Inst. f. datavetenskap
Variablernas roll i matematiken • Det finns inget begrepp som ett yttre tillstånd som kan påverka resultatet – under alla omständigheter är fib(6) lika med 8. Den här egenskapen kallas betydelsemässiggenomskinlighet (eng. referential transparency) 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ällerfib(n) = …". (Jämför med imperativa programspråk där en variabel står för ett specifikt men föränderligt värde!) Lennart Edblom, Frank Drewes, Inst. f. datavetenskap
Funktionella språk • Variabler har ha samma karaktär som i matematiken • Om uttryckens värde inte påverkas av kontexten är språket betydelsemässigt genomskinligt eller rent funktionellt ( inga som helst sidoeffekter) • Betydelsemässig 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 ibland för applikativa programspråk: För att få resultat utvärderas uttryck bestående av funktionsapplikationer. Lennart Edblom, Frank Drewes, Inst. f. datavetenskap
Funktionella språk (2) Viktiga ingredienser i ett funktionellt språk är ofta • begreppet (och notation för) funktionsapplikation • några primitiva datatyper och funktioner samt möjligheter att kombinera funktioner och datatyper till nya sådana • 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 = [f1,…,fk] h(x)= (f1(x),…,fk(x))iteration 'map': h = map f h(x1…xk) = f(x1)…f(xk) Lennart Edblom, Frank Drewes, Inst. f. datavetenskap
Det äldsta funktionella språket: LISP • LISP utvecklades kring 1960 av McCarthy och kan betraktas som en programspråksvariant av l-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 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap
Scheme • Variant av Lisp med statisk räckvidd, första klassens funktioner, inga onödigheter (enkel syntax & semantik) • Ex (member):(DEFINE (member a lst) (COND ((NULL? lst) ’()) ((EQ a (CAR lst)) #T) (ELSE (member a (CDR lst))))) • Som jämförelse, ML:fun member a [] = false | member a (h::t) = a=t orelse member a t; Lennart Edblom, Frank Drewes, Inst. f. datavetenskap
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 typkontroll • möjlighet att definiera (parametriserade) ADT:er • Viktigaste skillnader mellan ML och HASKELL • ML tillåter programmering i imperativ stil medan HASKELL är helt betydelsemässigt genomskinligt (inga sidoeffekter) • MLs evalueringsstrategi är strikt (eng. eager evaluation) medan HASKELLs är lat (eng. lazy evaluation) Lennart Edblom, Frank Drewes, Inst. f. datavetenskap
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. intsfrom n = n : intsfrom (n + 1) ints = intsfrom 1 Medlemsskap i ordnad lista. (”Guards” styr val av uttryck) memberOf (elem:rest) n | elem < n = memberOf rest n | elem == n = True | otherwise = False Lennart Edblom, Frank Drewes, Inst. f. datavetenskap
Lat evaluering (2) • Användbart för att separera beräkningar och kontroll.Beräkningsdel: Beräkna nödvändiga värden och stoppa in dem i t ex en lat lista.Kontrolldel: Traversera datastrukturen och ta fram önskade värden. • Ex: Beräkna kvadratroten ur x med Newton-Raphsons metod.yn+1 = 0.5 * (yn + x/yn) (ML-notation nedan) • fun apsqr x =letfun from app = app:: from(0.5 * (app + x/app))in from 1.0end • fun diff eps (a1:: a2:: as) =if abs (a1-a2) <= eps then a2 else diff eps (a2:: as) • val sqrt = diff 0.0001 o apsqr Lennart Edblom, Frank Drewes, Inst. f. datavetenskap
Mera Haskell • Typklasser≈OO-klasser med bara funktioner, arv • ”List comprehensions”Jfr mängduttryck. evens = [n|n<-ints; n mod 2 = 0] qsort [] = []qsort (h:t) = qsort[b|b<-t, b<=h] ++ [h] ++ qsort[b|b <-t, b>h] Lennart Edblom, Frank Drewes, Inst. f. datavetenskap