Warto być leniwym
08.12.2009 - Krzysztof Skrzętnicki
![]() ![]() ![]() Warto być leniwym... a przynajmniej czasami. W przypadku języka Haskell leniwy jest domyślny mechanizm przeprowadzania obliczeń: nie jest liczone nic, co nie jest niezbędnie potrzebne. Okazuje się, że daje nam to całą paletę ciekawych rozwiązań. Leniwość, to znaczy "zrobię to później"Jeżeli nie masz pojęcia o Haskellu kliknij tutajDla zrozumienia artykułu potrzebna będzie pewna znajomość Haskella. Jako wstęp do programowania w tym języku można uznać ten artykuł. W niniejszym artykule wykorzystane będą pojęcia i funkcje tam wprowadzone.
O co więc dokładnie chodzi z tą leniwością? Zobaczmy na prostym przykładzie niewielkiego programu:
Po uruchomienu:
Po uruchomieniu powyższy kawałek kodu wyświetli napis
Dlaczego tak się dzieje? Zobaczmy na definicję
Widzimy więc, że zgodnie z tym czego oczekiwaliśmy, jeżeli pierwszym argumentem jest W razie problemów...Leniwość w Haskellu potrafi czasem płatać różne figle. Dlatego aby móc śledzić przebieg obliczeń wymyślono szereg różnorodnych narzędzi. Do najprostszych z nich należy moduł
Funkcja
Po uruchomieniu:
Po zamianie
Po uruchomieniu:
Leniwość popłacaZobaczmy więc przykład, gdzie leniwość pozwoli nam zmniejszyć ilość wykonywanej pracy, przy jednoczesnym zachowaniu elegancji kodu. Chcemy napisać funkcję obliczającą pewne wartości statystyczne dla próbki liczb. Chcemy znać trzy parametry:
Jeżeli nie wiesz co oznaczają poszczególne nazwy - nie przejmuj się, nie musisz! Ważne jest to, że do policzenia wariancji wykorzystywana jest średnia, a do obliczenia odchylenia standardowego - wariancja.
Dygresja na temat implementacji funkcji policzStatystyki
W implementacji funkcji
policzStatystyki wystąpiło kilka prostych, lecz nowych elementów.Po pierwsze pojawiło się kilka funkcji:
Kolejnym elementem jest słowo kluczowe
let(co można przetłumaczyć na polskie "niech": niech x = 1 itd.). Pozwala ono na definiowanie symboli, które mogą być potem wykorzystane w kodzie. Przykładem zastosowania tego słowa kluczowego jest cała powyższa funkcja :-)Ostatni element, czyli specjalna notacja dla list:
wyjaśniony jest nieco dalej. Cierpliwości.
Zobaczmy jak działa nasza funkcja.
Po uruchomieniu zobaczymy:
Zgodnie z oczekiwaniem nie została policzona wartość dla odchylenia standardowego. Niewielki zysk, gdyż obliczenie pojedynczego pierwiastka to niewielki koszt. Ale mogło być też inaczej:
Po uruchomieniu:
Jak widzimy, ponieważ nie wykorzystaliśmy wartości wariancji, nie została ona policzona wcale. A to już jest spory zysk! Jednocześnie zauważmy, że nie musieliśmy w żaden specjalny sposób modyfikować kodu. Język sam zadbał o to, by wyliczone zostały tylko te fragmenty, które są potrzebne. Ćwiczenie Przetestuj działanie funkcji policzStatystyki. Sprawdź, jak działa np.
policzStatystyki [8,2,1]policzStatystyki [5,1,8,2,1,2,3]
(1 ocena) |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com