F#: po radosnej stronie programowania
Dwa lata temu spotkałem go poraz pierwszy. Cechowały go dziwna składnia, nienaturalny przepływ sterowania i komplikowanie najprostszych operacji do rocket science na linked listach i rekurencji. Pomyślałem wtedy - jak można pisać w czymś takim?! Byłem w błędzie.
/ wow, temat wpisu w ogóle nie sugerował takiego plot twistu /
Programowanie funkcyjne
Być może potknąłeś się o programowanie funkcyjne. Mógł to być wielki kamień stojący 20 metrów od Twojej ścieżki kariery. Tak, ten z wysprayowanym napisem “NIE DOTYKAĆ”. Jeżeli to Twój pierwszy kontakt z programowaniem funkcyjnym, to musisz wiedzieć, że programowanie funkcyjne nie jest nowym tworem. Podstawy teoretyczne istnieją już od lat 30 ubiegłego wieku, a pierwsze języki funkcyjne powstały w tych samych czasach, co pierwsze języki imperatywne.
Czym jest programowanie funkcyjne? Jest to po prostu podejście do pisania programów, w którym wszystkie rozwiązania problemów sprowadza się do zbudowania funkcji. Jeżeli Twoją pierwszą myślą jest “przecież teraz też implementuję funkcje”, to masz rację. Różnica polega na tym, że:
- przypisujesz wartości do zmiennych,
- implementujesz procedury (takie funkcje, tylko nie zwracające wartości),
- sterujesz wykonaniem programu instrukcja po instrukcji.
W podejściu funkcyjnym wszystko co robisz jest ubrane w funkcję. Wynik jednej funkcji musi być przekazany bezpośrednio do drugiej funkcji. Funkcja musi zwracać wartość.
F# nie jest językiem funkcyjnym.
/ Kurtyna /
F#
F# jest hybrydą. Większość języka jest skonstruowana pod paradygmat funcyjny. Mamy jednak wszystkie konstrukcje, potrzebne do stworzenia obiektowego kodu.
Kilka cech F# sprawia, że jest on doskonałym narzędziem do bezpiecznego programowania:
- statyczne typowanie z silną inferencją,
- używa wyrażeń zamiast twierdzeń - funkcja zawsze zwraca wartość,
- domyślnie operuje na wartościach niezmiennych (ang. immutable),
- używa typów opcjonalnych zamiast null,
- pozwala na łatwe zwracanie niepoprawnego stanu zamiast operowania na wyjątkach.
Istotną cechą F# jest możliwość wykorzystania kodu napisanego w tym języku w dowolnych aplikacjach .NET. Interoperacyjność pozwala na wykorzystanie właścowości F# w tych miejscach, w których mają zdecydowaną przewagę nad kodem C#. Przykładami takich zastosowań jest implementacja skomplikowanych algorytmów oraz tworzenie wielowątkowego kodu.
W kolejnych wpisach będę przybliżał poszczególne cechy F# i porównywał je z możliwościami języka C#.