Paradygmaty programowania/Ćwiczenia 12: Programowanie funkcyjne w Haskellu III: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
Linia 4: | Linia 4: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka:''' <div class="mw-collapsible-content" style="display:none"> Można użyć dopasowywania do wzorca lub odpowiedniej kaskady wyrażeń warunkowych. | <div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka:''' <div class="mw-collapsible-content" style="display:none"> Można użyć dopasowywania do wzorca lub odpowiedniej kaskady wyrażeń warunkowych. | ||
nibyalt :: Integer -> Integer -> Integer | |||
nibyalt 0 y = y | nibyalt 0 y = y | ||
nibyalt x y = 1 | nibyalt x y = 1 | ||
Zauważmy, że powyższa definicja jest prosta, ale ma dwa drobne mankamenty: wykorzystuje konkretną kolejność dopasowywania (od góry do dołu) oraz zwraca wartość różną od 1, jeśli x = 0 i y ≠ 1. Definicja z kaskadą wyrażeń warunkowych jest za to obszerniejsza: | Zauważmy, że powyższa definicja jest prosta, ale ma dwa drobne mankamenty: wykorzystuje konkretną kolejność dopasowywania (od góry do dołu) oraz zwraca wartość różną od 1, jeśli x = 0 i y ≠ 1. Definicja z kaskadą wyrażeń warunkowych jest za to obszerniejsza: | ||
nibyalt :: Integer -> Integer -> Integer | |||
nibyalt x y = if x /= 0 then 1 else if y /= 0 then 1 else 0 | nibyalt x y = if x /= 0 then 1 else if y /= 0 then 1 else 0 | ||
</div></div> | </div></div> | ||
===Zadanie 2=== | ===Zadanie 2=== | ||
Zapisać za pomocą wyrażeń z kwalifikatorem listę trójek pitagorejskich (czyli liczb naturalnych <math>x, y</math>, z takich, że <math>x^2 + y^2 = z^2</math>) z ustalonego zakresu. Chodzi zatem o funkcję o sygnaturze: | Zapisać za pomocą wyrażeń z kwalifikatorem listę trójek pitagorejskich (czyli liczb naturalnych <math>x, y</math>, z takich, że <math>x^2 + y^2 = z^2</math>) z ustalonego zakresu. Chodzi zatem o funkcję o sygnaturze: |
Wersja z 22:34, 23 wrz 2006
Zadanie 1
Napisać definicję leniwego operatora alternatywy na liczbach całkowitych, nie korzystając ze standardowego operatora ||.
Zadanie 2
Zapisać za pomocą wyrażeń z kwalifikatorem listę trójek pitagorejskich (czyli liczb naturalnych , z takich, że ) z ustalonego zakresu. Chodzi zatem o funkcję o sygnaturze:
trójkipit :: Integer -> [(Integer, Integer, Integer)]
Dla danego powinna ona stworzyć listę wszystkich trójek pitagorejskich, których elementy należą do przedziału .
Zadanie 3
Jak zmienić program z poprzedniego zadania, by nie wypisywał niepotrzebnie podobnych trójek, np. (3, 4, 5) i (4, 3, 5)?
Zadanie 4
Napisać funkcję lsilnia, która dla danego wygeneruje listę silni liczb od 1 do . Przykładowo, wywołanie lsilnia 4 ma dać listę [1, 2, 6, 24]. Jak zrobić to efektywnie?
Zadanie 5*
Zdefiniować operator >> za pomocą >>=.
Zadanie 6
Co się stanie przy poniższych wywołaniach? Sprawdź...
getChar >>= return return ’a’ >>= putChar