Ćwiczenia 15: Funktory

Zaprojektuj i zaimplementuj podane funktory:

  1. Monoid składania funkcji -- funktor, który dla określonego typu t konstruuje
    monoid z funkcją identycznościową i operacją składania funkcji (na t).
  2. Zdefiniuj funktor, który dla danego monoidu definiuje operację potęgowania.
  3. Zdefiniuj funktor, który na podstawie dwóch porządków liniowych tworzy porządek leksykograficzny na parach odpowiedniego typu.
  4. [SICP]
    Przypomnijmy sobie pakiet liczb wymiernych z poprzedniego wykładu.
    Można go zapisać w postaci funktora, sparametryzowanego (wybranym typem) liczb całkowitych.
    Podaj sygnaturę liczb całkowitych zawierającą wszystkie operacje potrzebne do zaimplementowania
    pakietu liczb wymiernych ze skracaniem ułamków.
    Naszkicuj konstrukcję funktora implementującego taki pakiet liczb wymiernych.
  5. [SICP]
    Wyobraźmy sobie pakiet implementujący wielomiany, wraz z rozmaitymi operacjami na wielomianach:
    suma, różnica, iloczyn, iloraz, reszta z dzielenia, porównanie, pochodna, itp.
    Pakiet taki może być sparametryzowany typem liczb (ciałem), nad którym rozpatrujemy wielomiany.
    Podaj odpowiednie sygnatury i naszkicuj sposób implementacji pakietu wielomianów jako funktora.
    Czy implementacja jest na tyle ogólna, aby pakiet działał nie tylko dla liczb zmiennopozycyjnych,
    ale również dla zespolonych i wymiernych?
  6. [SICP]
    Korzystając z wyników poprzednich ćwiczeń podaj, jak można skonstruować pakiet funkcji wymiernych?
  7. [SICP]
    Korzystając z wyników poprzednich ćwiczeń podaj, jak można skonstruować pakiet wielomianów dwóch zmiennych?
  8. [SICP]
    Porównaj funktory z mechanizmem dziedziczenia w programowaniu obiektowym.
    W jaki sposób można zasymulować hierarchię klas za pomocą funktorów?
    Co z rzutowaniem typów?
    Co z metodami wirtualnymi?

Uwaga: Zadania oznaczone [SICP] są mocno inspirowane zadaniami i materiałem z tejże książki, choć nie ma w niej mowy o funktorach.