Wartościowanie leniwe

(Przekierowano z Ewaluacja leniwa)

Wartościowanie leniwe (ang. lazy evaluation, ewaluacja leniwa) – strategia wyznaczania wartości argumentów funkcji tylko wtedy, kiedy są potrzebne (na żądanie).

Zaletami tego podejścia są możliwość obliczenia wartości funkcji nawet wtedy, gdy nie jest możliwe wyznaczenie wartości któregoś z jej argumentów, o ile tylko nie jest on używany, wzrost wydajności dzięki uniknięciu wykonywania niepotrzebnych obliczeń oraz możliwość tworzenia nieskończonych struktur danych. Wadą wartościowania leniwego jest to, że mogą nie wystąpić (być może oczekiwane) skutki uboczne procesu wyznaczania wartości argumentów.

Przeciwieństwem wartościowania leniwego jest wartościowanie zachłanne, stosowane w większości popularnych języków programowania.

Przykładem wartościowania leniwego jest[według kogo?] obsługa operatorów logicznych w większości języków programowania. Wyrażenie w języku C postaci:

a = funkcja_B(b) || funkcja_C(c) ? b : c;

Przypisanie do zmiennej a wartości b nastąpi gdy:

  • funkcja_B(b) zwróci prawdę, wtedy funkcja_C(c) nie zostanie wykonana
  • funkcja_B(b) zwróci fałsz, a funkcja_C(c) zwróci prawdę

W pierwszym przypadku nie nastąpi wywołanie funkcji funkcja_C(c) w związku z czym nie nastąpią jej efekty uboczne. W podobny sposób wykonany zostanie kod:

a = funkcja_B(b) && funkcja_C(c) ? b : c;

Przypisanie do zmiennej a wartości c nastąpi gdy:

  • funkcja_B(b) zwróci fałsz, wtedy funkcja_C(c) nie zostanie wykonana
  • funkcja_B(b) zwróci prawdę, a funkcja_C(c) zwróci fałsz

Z tego typu leniwego wartościowania korzysta idiom perla postaci:

funkcja(X) || die("mamy problem");

który określa, że jeżeli funkcja(X) nie zwróci prawdy, to znaczy, że mamy problem i należy zakończyć wykonanie programu.

Jednak oba wzmiankowane powyżej języki dokonują zachłannej ewaluacji wywołań funkcji, ponieważ w obu językach wartości argumentów funkcji są obliczane przed jej wykonaniem.

Przykładami języków stosujących leniwe wartościowanie są Haskell oraz D.

Zobacz też

edytuj