Programowanie funkcyjne/Procedury wyższych rzędów/Ćwiczenia

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Ćwiczenia

  • Zapisz procedurę length za pomocą foldr.
  • Zapisz procedurę append za pomocą foldr/foldl.
  • Za pomocą foldl zapisz procedurę rev.
  • suma listy funkcji,
  • złożenie listy funkcji,
  • Za pomocą map zapisz procedurę heads, której wynikiem dla danej listy list, jest lista pierwszych elementów list składowych.
  • Za pomocą filter zaimplementuj procedurę not_divisivble, która pozostawia na liście wszystkie elementy niepodzielne przez zadaną liczbę.
  • Wykorzystaj rozwiązanie poprzedniego zadania do zaimplementowania sita Eratostenesa.
  • Za pomocą foldr zapisz flatten. (let flatten l = foldr (@) l [];;)
  • Za pomocą foldl zapisz procedurę foldr.
  • Dane są: definicja typu tree i procedura fold_tree:
type tree = Node of tree * int * tree | Leaf;;
let rec fold_tree f a t = 
  match t with
  Leaf -> a |
  Node (l, x, r) -> f x (fold_tree f a l) (fold_tree f a r);;

Powiemy, że liczba w węźle drzewa jest widoczna, jeżeli na ścieżce od tego węzła do korzenia drzewa nie ma większej liczby. W szczególności liczba w korzeniu drzewa jest zawsze widoczna, a liczby mniejsze od niej nie są nigdy widoczne.

  • Napisz procedurę widoczne:drzewo int, która dla zadanego drzewa (zawierającego wyłącznie liczby nieujemne) obliczy liczbę widocznych liczb. Rozwiązując to zadanie nie wolno Ci tworzyć żadnych definicji rekurencyjnych. Powinieneś natomiast skorzystać z procedury fold_tree.

Laboratorium