Paradygmaty programowania/Ćwiczenia 11: Programowanie funkcyjne w Haskellu II: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Patola (dyskusja | edycje)
Patola (dyskusja | edycje)
Linia 45: Linia 45:
Ta definicja jest poprawna, ma jednak poważną wadę. Jaką? Jak ją wyeliminować, tzn. jak napisać dobrą funkcję sprawdzającą pustość listy?
Ta definicja jest poprawna, ma jednak poważną wadę. Jaką? Jak ją wyeliminować, tzn. jak napisać dobrą funkcję sprawdzającą pustość listy?


<div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka:''' <div class="mw-collapsible-content" style="display:none"> Sprawdzenie pustości listy jest tu poprzedzone wyliczeniem jej długości — a to przecież jest strata czasu. Co gorsza, takie sprawdzenie nie zadziała dla list nieskończonych, np. [1..]. Dobra funkcja może wyglądać jak poniżej; nie czynimy tu żadnych założeń o typie a, ani nie liczymy długości listy.
<div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka:''' <div class="mw-collapsible-content" style="display:none"> Sprawdzenie pustości listy jest tu poprzedzone wyliczeniem jej długości — a to przecież jest strata czasu. Co gorsza, takie sprawdzenie nie zadziała dla list nieskończonych, np. [1..]. Dobra funkcja może wyglądać jak poniżej; nie czynimy tu żadnych założeń o typie a ani nie liczymy długości listy.


   ''pusta3 :: [a] -> Bool
   ''pusta3 :: [a] -> Bool
Linia 52: Linia 52:


</div></div>
</div></div>
===Zadanie 5===
===Zadanie 5===
Napisać funkcję, która zwraca ostatni element niepustej listy. Funkcja powinna działać dla list dowolnego typu, bez jakichkolwiek dodatkowych założeń.
Napisać funkcję, która zwraca ostatni element niepustej listy. Funkcja powinna działać dla list dowolnego typu, bez jakichkolwiek dodatkowych założeń.

Wersja z 08:23, 21 wrz 2006

Zadanie 1

Zdefiniować odejmowanie dla typu Nat w dwóch wariantach: zupełnym i częściowym. W pierwszym odjęcie większej liczby od mniejszej ma dawać zero. W drugim wartość taka ma być niezdefiniowana. Co się stanie, jeśli spróbujemy jednak odjąć większą liczbę od mniejszej?

Wskazówka:

Zadanie 2

Zdefiniować silnię jako stosowną aplikację funkcji rekdef.

Wskazówka:

Zadanie 3*

Poniższa funkcja ma sprawdzać, czy podana lista jest pusta. Dlaczego definicja ta jest niepoprawna?

 pusta1 :: [a] -> Bool
 pusta1 x = (x == [])
Wskazówka:

Zadanie 4

Rozważmy zatem inny wariant sprawdzania pustości listy. Wykorzystajmy funkcję, która wylicza długość listy:

 pusta2 :: [a] -> Bool
 pusta2 x = (dl x == 0)

Ta definicja jest poprawna, ma jednak poważną wadę. Jaką? Jak ją wyeliminować, tzn. jak napisać dobrą funkcję sprawdzającą pustość listy?

Wskazówka:

Zadanie 5

Napisać funkcję, która zwraca ostatni element niepustej listy. Funkcja powinna działać dla list dowolnego typu, bez jakichkolwiek dodatkowych założeń.

Wskazówka:

Zadanie 6

Zdefiniować funkcję połącz, która połączy listę list w jedną listę. Przykładowo, połącz [[1, 2], [3, 4, 5], [6]] ma dać wynik [1, 2, 3, 4, 5, 6].

Wskazówka:

Zadanie 7

Przy funkcji połącz zdefiniowanej tak jak w poprzednim zadaniu, które wywołania są poprawne?

  • połącz [[[]]]
  • połącz [[1, 2], [], [3]]
  • połącz [[[1, 2]], [], 3]
  • połącz [[[1, 2]], [[]], 3]
  • połącz [[], [[]], [[[]]]]
  • połącz [[1], 2, [[[3]]]]
Wskazówka: