Zaprojektuj i zaimplementuj podane funktory:
-
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
).
-
Zdefiniuj funktor, który dla danego monoidu definiuje operację potęgowania.
-
Zdefiniuj funktor, który na podstawie dwóch porządków liniowych tworzy porządek leksykograficzny na parach odpowiedniego typu.
-
Zdefiniuj funktor, który dla danego pierścienia elementów tworzy pierścień macierzy 2x2.
- [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.
- [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?
- [SICP]
Korzystając z wyników poprzednich ćwiczeń podaj, jak można skonstruować pakiet funkcji wymiernych?
- [SICP]
Korzystając z wyników poprzednich ćwiczeń podaj, jak można skonstruować pakiet wielomianów dwóch zmiennych?
- [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.