Programowanie funkcyjne/Techniki uleniwiania i spamiętywania/Ćwiczenia

From Studia Informatyczne

Praca domowa

  • Wyrażenie warunkowe if-then-else nie jest procedurą, lecz formą specjalną, gdyż jest leniwe. W zależności od wartości warunku, tylko jeden z pozostałych członów jest obliczany. Napisz procedurę trójargumentową, która działa tak, jak if-then-else. Które z jej argumentów muszą być odroczone?
  • Napisz generator odroczonych liczb całkowitych. W momencie wymuszenia obliczenia takiej liczby powinna ona być wczytywana z wejścia. Wczytywaniu powinien towarzyszyć tekst podawany jako parametr przy generowaniu odroczonej liczby.
  • Napisz generator odroczonych liczb losowych. Wartość każdej takiej liczby powinna być losowana dopiero w momencie wymuszenia jej obliczenia, jednak musi być zagwarantowane, że jest ona inna od wszystkich wcześniej wylosowanych liczb. Może być przydatna procedura Random.int.

Ćwiczenia

  • Co by się stało, gdyby definicja procedury konto (z przykładu "Konto bankowe") nie miała argumentusaldo, lecz zaczynała się jak poniżej?
let konto = 
  let saldo = ref 0
  in ...
  • Zdefiniuj "rzadkie tablice" (jednowymiarowe). Tworząc tablicę podajemy jej rozmiar oraz procedurę inicjującą komórki tablicy (sparametryzowaną indeksem komórki). Początkowo tablica jest faktycznie pusta. Próba odczytania niezainicjowanego elementu powoduje wywołanie procedury inicjującej. Próba zapisu do niezainicjowanego elementu powoduje zapis bez wywoływania procedury inicjującej. Elementy raz zainicjowane istnieją do końca życia całej tablicy.
Zdefiniuj typ reprezentujący rzadkie tablice oraz nastepujące operacje:
  • utworzenie rzadkiej tablicy,
  • odczytanie elementu z tablicy,
  • zapisanie elementu do tablicy.
  • W jaki sposób można połączyć technikę uleniwiania (ze spamiętywaniem) z programowaniem dynamicznym, tak aby obliczane były tylko te instancje podproblemów, które faktycznie muszą być obliczone?