12
2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 11: Funktionella språk Funktioner och variabler i matematiken Funktionella språk LISP (Scheme), ML och HASKELL Lat evaluering

Föreläsning 11: Funktionella språk

  • Upload
    keilah

  • View
    25

  • Download
    0

Embed Size (px)

DESCRIPTION

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 - PowerPoint PPT Presentation

Citation preview

Page 1: Föreläsning 11: Funktionella språk

2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap

1

Föreläsning 11: Funktionella språk

• Funktioner och variabler i matematiken• Funktionella språk• LISP (Scheme), ML och HASKELL• Lat evaluering

Page 2: Föreläsning 11: Funktionella språk

2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap

2

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 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 aA, finns max ett bB där (a,b)f.

Page 3: Föreläsning 11: Funktionella språk

2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap

3

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).

fib(n) = n om n 1

fib(n1) + fib(n2) annars

• Exempel: Fibonacci-funktionens definition

Page 4: Föreläsning 11: Funktionella språk

2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap

4

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 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)

Page 5: Föreläsning 11: Funktionella språk

2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap

5

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.

Page 6: Föreläsning 11: Funktionella språk

2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap

6

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)

Page 7: Föreläsning 11: Funktionella språk

2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap

7

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

Page 8: Föreläsning 11: Funktionella språk

2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap

8

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;

Page 9: Föreläsning 11: Funktionella språk

2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap

9

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)

Page 10: Föreläsning 11: Funktionella språk

2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap

10

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

Page 11: Föreläsning 11: Funktionella språk

2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap

11

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 =let fun 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

Page 12: Föreläsning 11: Funktionella språk

2003-12-05 Lennart Edblom, Frank Drewes, Inst. f. datavetenskap

12

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]