This is an old revision of the document!


  • evaluare aplicativă - argumentele funcțiilor sunt evaluate înaintea aplicării funcției asupra lor.
  • evaluare lenesa - întârzie evaluarea parametrilor până în momentul când aceasta este folosită efectiv.

Evaluare aplicativă vs. evaluare normală

Fie urmatoarea expresie, scrisă într-o variantă relaxată a Calculului Lambda (în care valori numerice și operații pe acestea sunt permise, iar funcțiile sunt în formă uncurried):

(λx.λy.(x + y) 1 2)

Evident, în urma aplicării funcției de mai sus, expresia se va evalua la 3. Să observăm, însă, cazul în care parametrii funcției reprezintă aplicații de funcții:

(λx.λy.(x + y) 1 (λz.(z + 2) 3))

Desigur, evaluarea expresiei (λz.(z + 2) 3) va genera valoarea 5, de unde deducem că rezultatul final al expresiei va fi 6 ( adunarea lui 1 cu rezultatul anterior ). În cadrul acestui raționament, am presupus că parametrii sunt evaluați înaintea aplicării funcției asupra acestora. Vom vedea, în cele ce urmează, că evaluarea se poate realiza și in alt mod.

Evaluare aplicativă

Evaluarea aplicativă (eager evaluation) este cea în care fiecare expresie este evaluată imediat. În exemplul de mai sus, evaluarea aplicativă va decurge astfel:

(λx.λy.(x + y) 1 (λz.(z + 2) 3))
(λx.λy.(x + y) 1 5)
6

Evaluare normală

Spre deosebire de evaluarea aplicativă, evaluarea normală va întarzia evaluarea unei expresii, până când aceasta este folosită efectiv. Exemplu:

(λx.λy.(x + y) 1 (λz.(z + 2) 3))
(1 + (λz.(z + 2) 3))
(1 + 5)
6

Exerciții:

I. Șiruri

  1. Construiți șirul numerelor naturale
  2. Construiți șirul numerelor pare
  3. Construiți șirul numerelor lui Fibonacci

II. Aproximații

1. definiți o funcție build :: (a → a) → a → [a] care primeste o funcție 'generator' (pe care o numim g în continuare), o valoare inițială (a0), și generază lista: [a0, g a0, g (g a0), g (g (g a0)), …

Comportamentul funcției ar trebui să fie identic cu cel al funcției iterate, deja existentă în Haskell.
Prelude> :t iterate
iterate :: (a -> a) -> a -> [a]

2. definiți o funcție select care primește o toleranță e, o listă, și întoarce valoarea $ a_n$ din listă care satisface proprietatea: $ abs(a_n - a_{n+1}) < e$

3. Aproximație pentru $ \sqrt{k}$ :
a) Scrieți o funcție care calculează $ \sqrt{k}$ cu toleranța 0.01, exploatând faptul că șirul: $ a_n = 1/2(a_{n-1} + k/a_{n-1})$ converge către $ \sqrt{k}$ când n tinde la infinit.

4. Aproximație pentru derivata unei funcții f într-un punct a:
a) Scrieți o funcție care generează lista: [h_0, h_0/2, h_0/4, h_0/8, …]
b) Scrieți o funcție care calculează lista aproximarilor lui f'(a), calculate astfel: $ \displaystyle f'(a)=\lim_{h \rightarrow 0} \frac{f(a+h)-f(a)}{h}$
c) Scrieți o funcție care calculează derivata in a a unei funcții f, cu toleranța 0.01

5. Aproximație pentru integrala unei funcții pe intervalul [a,b]:
a) Scrieți o funcție care aproximează valoarea integralei unei funcții f între a și b, cu toleranța 0.01. Strategia de îmbunătățire a unei aproximări constă în spargerea intervalului [a,b] în două sub-intervale de dimensiune egală [a,m] si [m,b], calculul integralei pe fiecare, și adunarea rezultatului.