Programowanie funkcjonalne - inne spojrzenie na świat
31.10.2009 - Krzysztof Skrzętnicki
![]() ![]() Ilu ludzi na świecie - tyle sposobów postrzegania tego świata. Języki programowania służą opisowi świata programów - i tutaj również zaskoczyć nas może wielka różnorodność. Zastanówmy się czym różnią się te dwa przepisy na znalezienie długości listy elementów: Można tak: Wyzeruj licznik. Zacznij na początku listy. Jeżeli znalazłeś się na końcu listy, zwróć licznik. W przeciwnym wypadku zwiększ licznik o jeden, przesuń się do następnego elementu i ponownie wykonaj sprawdzenie. Albo tak: Lista pusta ma długość zero. Rozmiar listy niepustej to jeden plus rozmiar tej listy z pominięciem pierwszego elementu. Oba są poprawne - a jednak różnią się na pewnym podstawowym poziomie. Pierwszy opis jest imperatywny - opisuje ciąg instrukcji które należy wykonać, by uzyskać pewną wartość. Drugi opis stara się w bardziej bezpośredni sposób zdefiniować czym jest ta wartość. Ten drugi opis o wiele bardziej oddaje ducha programowania funkcjonalnego. Języków funkcjonalnych jest wiele. Jednym z ciekawszych reprezentantów tej grupy jest Haskell. To właśnie z niego będziemy dzisiaj korzystać poznając ten interesujący paradygmat programowania. Od matematyki do programowaniaCechą Haskella, którą często podkreślają jego sympatycy, jest czytelność zapisu. Niejednokrotnie definicja matematyczna funkcji jest bardzo podobna do kodu programu. W Haskellu funkcje działają na zasadzie rozpatrywania przypadków. Każdy z przypadków zapisujemy w formie:
Co oznacza rozpatrywanie przypadków? Oznacza to, że możemy nakładać pewne warunki na to, jaką wartość przyjmują poszczególne argumenty. Aby zobaczyć, jak działa to w praktyce, rozważmy pewną bardzo prostą funkcję.
I tak dla liczby Jak długa jest ta lista?Wróćmy teraz do przepisu na długość funkcji z początku artykułu. Tutaj możemy przeczytać go równolegle z kodem programu, który realizuje tą funkcję:
Wyjaśnijmy sobie szczegóły tego zapisu. W przypadku funkcji
[].
Drugi przypadek wprowadza nam sposób na dopasowywanie argumentu do listy niepustej. Jak można się domyśleć przed dwukropkiem
To Wracając więc do naszej funkcji: w drugim przypadku wywołujemy więc rekurencyjnie funkcję Małe ćwiczenie. W poniższe pole możesz wpisać kod do wykonania. Spróbuj wpisać np.:
albo:
Krótka dygresja na temat notacji listowych Istnieją dwa sposoby zapisu list. W obu z nich listę pustą oznacza się przez
[]. Różnią się w odniesieniu do list dłuższych. Oto pierwszy z nich:
Jego zaletą jest czytelność. Wadą - to, że z góry musimy powiedzieć, jakiej długości jest lista. Ponieważ nasza funkcja
dlugosc ma działać dla list o dowolnej długości, nie możemy użyć tego zapisu.Na scenę wkracza więc drugi sposób zapisu. Zamiast podawać wszystkie elementy po kolei mówimy tylko, że lista to coś, co ma pierwszy element (głowę) i wszystkie pozostałe (ogon). Głowę oddzielamy od ogona dwukropkiem:
Zapis powyższej listy wyglądałby więc następująco:
Dla czytelności zapisu poszczególne fragmenty zostały otoczone nawiasami. Można je jednak pominąć:
Każdy z dwukropktów w powyższym zapisie można odczytać jako "...jest głową, a ogonem jest lista taka że...".
Listę tą można także zwizualizować tym diagramem:
A po co mi ten kaktus?Zagłębijmy się dalej w ten język programowania. Zdarza się, że pewna część wartości nas nie interesuje. Tak jest w przypadku głowy listy w funkcji
Wystarczy, że zamiast nazwy zmiennej wpiszemy znak podkreślenia:
Zabawy listamiAby okrzepnąć w używaniu list, napiszmy kilka przykładowych funkcji.
Funkcja Tutaj widzimy jeszcze jedną ciekawą właściwość. Kiedy zapis Ćwiczenie. Jakie argumenty należy podać do
Podobnie jak w poprzednich funkcjach rozkładamy listę na głowę Ćwiczenie. Obliczamy wartość
x xs, tak by w wyniku otrzymać [6,2,0]
(5 ocen) |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com