Paradygmaty programowania/Ćwiczenia 11: Programowanie funkcyjne w Haskellu II: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
Linia 1: | Linia 1: | ||
===Zadanie 1=== | ===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ć | 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? | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka:''' <div class="mw-collapsible-content" style="display:none"> Odejmowanie częściowe może wyglądać tak: | <div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka:''' <div class="mw-collapsible-content" style="display:none"> Odejmowanie częściowe może wyglądać tak: |
Wersja z 08:22, 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?
Zadanie 2
Zdefiniować silnię jako stosowną aplikację funkcji rekdef.
Zadanie 3*
Poniższa funkcja ma sprawdzać, czy podana lista jest pusta. Dlaczego definicja ta jest niepoprawna?
pusta1 :: [a] -> Bool pusta1 x = (x == [])
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?
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ń.
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].
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]]]]