Programowanie funkcyjne/Funktory/Ćwiczenia: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przemek (dyskusja | edycje)
Nie podano opisu zmian
 
Kubica (dyskusja | edycje)
 
(Nie pokazano 4 wersji utworzonych przez 3 użytkowników)
Linia 1: Linia 1:
\cwiczenia
== Praca domowa ==
**;Podaj sygnaturę implementacji struktury danych liczb zespolonych
* Napisz funktor implementujący liczby całkowite "podwójnej precyzji". Jego parametrem powinien być pakiet liczb całkowitych z ograniczonego zakresu, a wynikiem pakiet liczb całkowitych zwiększonego zakresu. Sygnatury parametru i wyniku powinny być takie same, tak aby funktor można było składać z samym sobą otrzymując liczby całkowite "poczwórnej precyzji".
*;(wyłącznie konstruktory i selektory biegunowe i prostokątne).
* Napisz funktor implementujący ogólny mechanizm przeszukiwania z nawrotami (ang. ''back-tracking''). Sprecyzuj najpierw rodzaj przeszukiwania (np. czy znajdowane jest jedno rozwiązanie, wszystkie rozwiązania czy też najlepsze rozwiązanie).
*;Sygnatura powinna pasować do dowolnej implementacji:
 
*;biegunowej, prostokątnej lub mieszanej.  
== Ćwiczenia ==
*;Naszkicuj implementację reszty pakietu liczb zespolonych,
* Podaj sygnaturę implementacji struktury danych liczb zespolonych (wyłącznie konstruktory i selektory, biegunowe i prostokątne). Sygnatura powinna pasować do dowolnej implementacji: biegunowej, prostokątnej lub mieszanej. Naszkicuj implementację reszty pakietu liczb zespolonych jako funktor, którego parametrem jest implementacja struktury danych, a wynikiem w pełni funkcjonalny pakiet.
*;jako funktor, którego parametrem jest implementacja struktury danych,
* 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. Napisz funktor implementujący taki pakiet liczb wymiernych.  
*;a wynikiem w pełni funkcjonalny pakiet.
* 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) współczynników wielomianu. 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?
**;Przypomnijmy sobie pakiet liczb wymiernych z poprzedniego wykładu.
* Porównaj sygnatury wielomianów i liczb zastosowanych do budowy liczb wymiernych. Czy można ich użyć do stworzenia pakietu liczb wymiernych, jako ułamków, których współczynnikami wielomiany? Jeżeli nie, to co trzeba zmienić? Zwróć uwagę na skracanie ułamków.
*;Można go zapisać w postaci funktora, sparametryzowanego
* Korzystając z wyników poprzednich zadań podaj, jak można skonstruować pakiet wielomianów dwóch zmiennych? Czy współczynnikami wielomianów jednej zmiennej mogą być wielomiany drugiej zmiennej?
*;(wybranym typem) liczb całkowitych.
* Podaj sygnaturę struktury implementującej przestrzeń metryczną oraz zaimplementuj przestrzeń liczb rzeczywistych z metryką |...|. Napisz funktory implementujące metrykę euklidesową i typu Manhattan na produkcie kartezjańskim dwóch przestrzeni metrycznych. Jak za ich pomocą można zapisać przestrzeń <math>R^3</math> z metryką euklidesową i  Manhattan?
*;Podaj sygnaturę liczb całkowitych zawierającą wszystkie
* Napisz funktor implementujący wybraną strategię grania w dowolną grę dwuosobową, z pełną informacją, bez losowości i z binarnym wynikiem (takiej jak szachy, Go, warcaby, Nim, czy kółko i krzyżyk), np. mini-max, alfa-beta obcięcie, drzewa and-or.
*;operacje potrzebne do zaimplementowania pakietu liczb wymiernych
* Rozważamy funktor służący do generowania losowych drzew binarnych. Typ takich drzew jest postaci: <tt>type tree = Leaf | Node of tree * t * tree</tt>.  Losowe drzewo z prawdopodobieństwem $p$ jest puste (\texttt{Leaf}), a z prawdopodobieństwem $1-p$ składa się z dwóch losowych poddrzew i losowej wartości w korzeniu. Parametr funktora definiuje:
*;ze skracaniem ułamków.
** typ <tt>t</tt>,
*;(Potrzebne są: operacje arytmetyczne, równość, modulo i ew.\
** procedurę <tt>random_leaf : unit -> bool</tt>, która z prawdopodobieństwem <i>p</i> zwraca <tt>true</tt>,
*;porównywanie.)
** procedurę <tt>random_t : unit -> t</tt>, która zwraca losową wartość typu <tt>t</tt>.
*;Naszkicuj budowę funktora implementującego taki pakiet
: Zdefiniuj opisany funktor.
*;liczb wymiernych.  
**;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?
**;Korzystając z wyników poprzednich ćwiczeń podaj, jak można
*;skonstruować pakiet funkcji wymiernych?
*;(Jest to pakiet liczb wymiernych, których współczynniki
*;wielomianami.)
**;Korzystając z wyników poprzednich ćwiczeń podaj, jak można
*;skonstruować pakiet wielomianów dwóch zmiennych?
*;(Są to wielomiany jednej zmiennej, których współczynniki są
*;wielomianami drugiej zmiennej.)
**;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?
*;(Nie wiem czy to dobre zadanie.
*;Może tak, a może jest już zbyt późno, ale jakiś związek widzę.)

Aktualna wersja na dzień 21:20, 26 lut 2012

Praca domowa

  • Napisz funktor implementujący liczby całkowite "podwójnej precyzji". Jego parametrem powinien być pakiet liczb całkowitych z ograniczonego zakresu, a wynikiem pakiet liczb całkowitych zwiększonego zakresu. Sygnatury parametru i wyniku powinny być takie same, tak aby funktor można było składać z samym sobą otrzymując liczby całkowite "poczwórnej precyzji".
  • Napisz funktor implementujący ogólny mechanizm przeszukiwania z nawrotami (ang. back-tracking). Sprecyzuj najpierw rodzaj przeszukiwania (np. czy znajdowane jest jedno rozwiązanie, wszystkie rozwiązania czy też najlepsze rozwiązanie).

Ćwiczenia

  • Podaj sygnaturę implementacji struktury danych liczb zespolonych (wyłącznie konstruktory i selektory, biegunowe i prostokątne). Sygnatura powinna pasować do dowolnej implementacji: biegunowej, prostokątnej lub mieszanej. Naszkicuj implementację reszty pakietu liczb zespolonych jako funktor, którego parametrem jest implementacja struktury danych, a wynikiem w pełni funkcjonalny pakiet.
  • 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. Napisz funktor implementujący taki pakiet liczb wymiernych.
  • 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) współczynników wielomianu. 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?
  • Porównaj sygnatury wielomianów i liczb zastosowanych do budowy liczb wymiernych. Czy można ich użyć do stworzenia pakietu liczb wymiernych, jako ułamków, których współczynnikami są wielomiany? Jeżeli nie, to co trzeba zmienić? Zwróć uwagę na skracanie ułamków.
  • Korzystając z wyników poprzednich zadań podaj, jak można skonstruować pakiet wielomianów dwóch zmiennych? Czy współczynnikami wielomianów jednej zmiennej mogą być wielomiany drugiej zmiennej?
  • Podaj sygnaturę struktury implementującej przestrzeń metryczną oraz zaimplementuj przestrzeń liczb rzeczywistych z metryką |...|. Napisz funktory implementujące metrykę euklidesową i typu Manhattan na produkcie kartezjańskim dwóch przestrzeni metrycznych. Jak za ich pomocą można zapisać przestrzeń R3 z metryką euklidesową i Manhattan?
  • Napisz funktor implementujący wybraną strategię grania w dowolną grę dwuosobową, z pełną informacją, bez losowości i z binarnym wynikiem (takiej jak szachy, Go, warcaby, Nim, czy kółko i krzyżyk), np. mini-max, alfa-beta obcięcie, drzewa and-or.
  • Rozważamy funktor służący do generowania losowych drzew binarnych. Typ takich drzew jest postaci: type tree = Leaf | Node of tree * t * tree. Losowe drzewo z prawdopodobieństwem $p$ jest puste (\texttt{Leaf}), a z prawdopodobieństwem $1-p$ składa się z dwóch losowych poddrzew i losowej wartości w korzeniu. Parametr funktora definiuje:
    • typ t,
    • procedurę random_leaf : unit -> bool, która z prawdopodobieństwem p zwraca true,
    • procedurę random_t : unit -> t, która zwraca losową wartość typu t.
Zdefiniuj opisany funktor.