[go: nahoru, domu]

Przejdź do zawartości

Wartościowanie leniwe: Różnice pomiędzy wersjami

Z Wikipedii, wolnej encyklopedii
[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
CiaPan (dyskusja | edycje)
+{{według kogo}}
Funkcja sugerowania linków: dodane 2 linki.
 
Linia 4: Linia 4:
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 [[struktura danych|struktur danych]]. Wadą wartościowania leniwego jest to, że mogą nie wystąpić (być może oczekiwane) [[Skutek uboczny (informatyka)|skutki uboczne]] procesu wyznaczania wartości argumentów.
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 [[struktura danych|struktur danych]]. Wadą wartościowania leniwego jest to, że mogą nie wystąpić (być może oczekiwane) [[Skutek uboczny (informatyka)|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.
Przeciwieństwem wartościowania leniwego jest '''[[wartościowanie zachłanne]]''', stosowane w większości popularnych [[Język programowania|języków programowania]].


Przykładem wartościowania leniwego jest{{według kogo|data=2021-02}} obsługa operatorów logicznych w większości języków programowania. Wyrażenie w [[C (język programowania)|języku C]] postaci:
Przykładem wartościowania leniwego jest{{według kogo|data=2021-02}} obsługa [[Operator logiczny|operatorów logicznych]] w większości języków programowania. Wyrażenie w [[C (język programowania)|języku C]] postaci:
<syntaxhighlight lang='C'>a = funkcja_B(b) || funkcja_C(c) ? b : c;</syntaxhighlight>
<syntaxhighlight lang='C'>a = funkcja_B(b) || funkcja_C(c) ? b : c;</syntaxhighlight>
Przypisanie do zmiennej <code>a</code> wartości <code>b</code> nastąpi gdy:
Przypisanie do zmiennej <code>a</code> wartości <code>b</code> nastąpi gdy:

Aktualna wersja na dzień 03:02, 26 lut 2023

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 | edytuj kod]