W jakich sytuacjach powinienem wybrać funkcjonalny język programowania zamiast bardziej rozwlekłego języka zorientowanego obiektowo, takiego jak C ++, C # czy Java?
Rozumiem, co to jest programowanie funkcjonalne, czego tak naprawdę nie rozumiem, dla jakiego rodzaju problemów jest to idealne rozwiązanie?
functional-programming
language-agnostic
Alex Baranosky
źródło
źródło
Odpowiedzi:
Moim zdaniem języki funkcjonalne są dobre głównie do dwóch rzeczy: sztucznej inteligencji w grach i obliczeń matematycznych. Jest dobry w grach AI ze względu na przyjemne manipulowanie listami (przynajmniej w Lisp i Scheme) oraz w obliczeniach matematycznych ze względu na składnię. Scheme, Lisp i Haskell mają składnię, która sprawia, że obliczenia matematyczne są łatwe do odczytania. Ostatnią rzeczą, którą muszę dodać, jest to, że języki funkcjonalne to naprawdę zabawne języki. Mój kurs w programie Scheme był jednym z kursów, z których bawiłem się najlepiej.
źródło
Sam przeprowadziłem kilka badań w tej sprawie i pomyślałem, że mogę dodać CONCURRENCY do listy powodów, dla których warto używać języka funkcjonalnego. Zobacz w pewnym momencie w najbliższej przyszłości prędkość procesora nie będzie mogła wzrosnąć przy użyciu tej samej technologii procesora. Fizyka architektury na to nie pozwala.
I tu właśnie pojawia się współbieżne przetwarzanie.
Niestety większość języków OOP nie może jednocześnie korzystać z wielu procesorów ze względu na współzależności między danymi.
W czysto funkcjonalnych językach programowania komputer może uruchamiać dwie (lub wiele więcej) funkcji jednocześnie, ponieważ funkcje te nie zmieniają zewnętrznych informacji o stanie.
Oto doskonały artykuł na temat programowania funkcjonalnego, który może Ci się spodobać.
źródło
Mój przyjaciel zacytował jednego z jego profesorów z college'u, mówiąc coś takiego:
Moja odpowiedź jest taka, że FP to całkowicie realne podejście do programowania z tak szerokim zakresem zastosowań, jak OO. Podobnie jak w przypadku każdej dyskusji dotyczącej wyboru języka programowania, myślę, że ważniejsze pytania to:
Jeśli chodzi o pierwsze pytanie, jeśli robisz to przede wszystkim ze względu na wartość edukacyjną, sugerowałbym przyjrzenie się Haskellowi , ze względu na szeroki zakres materiałów pomocniczych (książki, artykuły, aktywna społeczność itp.)
Jeśli chodzi o drugie pytanie, Haskell ma niezłą gamę bibliotek (chociaż niektóre są bardziej dojrzałe niż inne), ale Scala (hybrydowy język OO-funkcjonalny działający na JVM) ma zalety polegające na tym, że można bardziej stopniowo przechodzić do stylu funkcjonalnego , i masz dostęp do pełnego zakresu bibliotek dostępnych w języku Java.
źródło
Praktycznie wszystko, co możesz zrobić w PP, można zrobić w FP i to samo na odwrót. To po prostu inny sposób kodowania czegoś - inna perspektywa na problem i inny sposób jego rozwiązania.
Jednakże, ponieważ niewiele osób używa FP, problem polega bardziej na braku dobrych bibliotek, przenośności / łatwości utrzymania (ponieważ opiekun ma większą szansę na zrozumienie czegoś napisanego w C ++ niż Scheme) oraz braku dokumentacji i społeczności. Wiem, że jest kilka dokumentów, jednak porównaj je z C ++, C # lub Javą, a zrozumiesz, o co mi chodzi.
Jeśli jednak naprawdę chcesz robić FP, możesz użyć tego stylu nawet w C ++ i C #. Oczywiście nie będzie to 100% FP, jeśli używasz standardowej biblioteki. Niestety, nie sądzę, aby C # był zoptymalizowany do użytku z programowaniem funkcjonalnym i prawdopodobnie spowoduje wiele problemów z wydajnością.
To bardziej subiektywny post, co myślę o FP. Nie jest to rygorystyczna deklaracja.
źródło
Języki funkcjonalne sprawdzają się w wielu sytuacjach. To zależy od bibliotek konkretnego języka funkcjonalnego.
Jak odpowiedziałbyś na pytanie „Kiedy używać języka programowania obiektowego?”?
źródło
Chociaż jest to dość subiektywne pytanie, chciałbym tylko dodać, że języki funkcjonalne są często używane do analizowania języków specyficznych dla domeny ; charakter funkcjonalny dobrze nadaje się do analizowania gramatyki.
źródło
Z tego, co widziałem, jest to bardziej kwestia gustu niż funkcjonalności (gra słów nie jest zamierzona). Tak naprawdę nie ma nic w żadnym stylu języka, który z natury czyni go lepszym lub gorszym w określonych zadaniach.
źródło
Ogólnie rzecz biorąc, używaj języka, w którym najłatwiej jest opisać rozwiązanie problemu. W przypadku programowania funkcjonalnego jest to sytuacja, w której rozwiązanie problemu można łatwo wyrazić za pomocą funkcji , stąd nazwa. Ogólnie jest dobry do operacji matematycznych, sztucznej inteligencji, dopasowywania wzorców; ogólnie wszystko, co można podzielić na zestaw reguł, które należy zastosować, aby uzyskać odpowiedź. Dopiero po dostatecznym przeanalizowaniu problemu można naprawdę określić „najlepszy” język. Tutaj z pomocą przychodzi pseudokod. Jeśli zauważysz, że piszesz pseudokod, który wygląda jak FP, użyj FP.
Oczywiście wszystkie kompletne języki programowania są funkcjonalnie równoważne, więc tak naprawdę nie ma znaczenia, który wybierzesz pod względem problemów, które możesz rozwiązać. Główne efekty będą dotyczyły wydajności i dokładności kodowania oraz łatwości konserwacji.
Zauważ również, że możliwe jest naśladowanie FP w językach OO poprzez sprytnie zaprojektowane API. Na przykład, widziałem wiele bibliotek Java (jednym z przykładów jest JMock), które używają łańcuchów metod do symulacji FP DSL. Następnie zobaczysz konstrukcje, takie jak:
logger.expects(once()).method("error") .with( and(stringContains(action),stringContains(cause)) );
To zasadniczo tworzy funkcję, która jest oceniana w celu określenia, czy jakaś sekwencja wywoływania na obiekcie pozorowanym jest poprawna. (przykład skradziony z http://www.jmock.org/yoga.html )
Inną składnią podobną do FP w innych językach OO jest użycie domknięć, na przykład w Rubim.
źródło