Scala. Język hybrydowy

Bezpłatny fragment

Scala i styl funkcyjny

Czystość funkcyjna

Funkcje wyższego rzędu

Prosty przykład

Przykład praktyczny

Co ze znajdowaniem błędów i wydajnością?

Praca z kolekcjami języka Scala

Kolekcje niemutowalne

Kolekcje zmienne (mutowalne)

Kolekcje leniwe

Tworzenie funkcji wyższego rzędu w języku Scala

Tworzenie funkcji wyższego rzędu

Wiele list parametrów

Wartości funkcji i wzorzec pożyczki

Przypisy

SCALA I STYL FUNKCYJNY

AUTOR – Venkat Subramaniam

Podczas projektowania języka Scala Martin Odersky zrobił odważny, niekonwencjonalny krok, łącząc ze sobą dwa różne paradygmaty: obiektowy i funkcyjny. Nie jest to proste zadanie – oba style są bardzo różne, a połączenie dwóch różnych paradygmatów stanowi prawdziwe wyzwanie.

Aby zrozumieć, jakie przeszkody stały przed Oderskym, popatrzmy najpierw, co oznacza być funkcyjnym. Są tu dwa aspekty definiujące funkcjonalny styl programowania: czystość funkcji oraz programowanie za pomocą funkcji wyższego rzędu.

Czystość funkcyjna

Czystość oznacza, że funkcje nie mają efektów ubocznych. Wyjście z funkcji jest przewidywalnie takie samo, jeśli tylko takie same pozostaje wejście. Na czystą funkcję nic nie wpływa, a ona nie wpływa na żaden element zewnętrzny. Oznacza to także, że nie zmienia ona żadnej wartości.

Wśród zalet czystości funkcji warto wymienić dwie. Po pierwsze łatwiej jest zrozumieć i udowodnić poprawność czystej funkcji. Po drugie czyste funkcje promują transparentność odwołań. Czyste funkcje można łatwo przeorganizować i zmienić kolejność ich wykonywania w wielu wątkach, co ułatwia programowanie współbieżności na procesorach wielordzeniowych.

Scala nie wymusza czystości, ale ułatwia wykrycie, gdzie są używane zmienne mutowalne – po prostu szukamy var. Dobrą praktyką w Scali jest korzystanie możliwie często z niemutowalności, a konkretnie z niemutowalnych val.

Funkcje wyższego rzędu

Innym aspektem stylu funkcyjnego jest praca z funkcjami wyższego rzędu – chodzi o traktowanie funkcji jak obywateli pierwszej klasy. Pozwala nam to na przekazywanie funkcji do funkcji, tworzenie funkcji wewnątrz funkcji oraz zwracanie funkcji z funkcji. To z kolei pozwala na składanie funkcji, a zaletą Scali jest możliwość projektowania złożenia funkcji i złożenia obiektów, tak jak chcemy lub jak jest to właściwe.

Przeanalizujmy podejście w Scali do programowania funkcyjnego na przykładach. Zaczniemy od małych przykładów, które tylko posługują się liczbami, tak aby łatwo zrozumieć sposób używania w Scali funkcji wyższego rzędu. Następnie spojrzymy na przykład praktyczny, gdzie zastosujemy poznane pojęcia.