To pytanie wynika z pytania /software/25569/is-haskell-worth-learning
Zasadniczo pada kilka często powtarzanych stwierdzeń na temat tego, w jaki sposób Haskell poprawia twoje umiejętności kodowania w innych językach, a ponadto dzieje się tak, ponieważ Haskell jest bezstanowy, i to dobrze.
Dlaczego?
Widziałem, jak ktoś porównuje to do pisania tylko lewą ręką lub zamykania oczu na jeden dzień i polegania na dotyku. Z pewnością jest w tym coś więcej?
Czy dotyczy to dostępu do pamięci sprzętowej, czy może czegoś innego, co stanowi duży wzrost wydajności?
Odpowiedzi:
z głowy mam co najmniej trzy duże zalety:
sprawia, że programy są bardziej zbliżone do wyrażeń matematycznych. W matematyce
x
nic się nie zmienia, po prostu nie wiesz, co to jest, dopóki nie rozwiążesz równania.W końcu, nie jest zmiana stanu (po wszystkim, to jak komputer działa na niskim poziomie); ale język ogranicza się do określonych miejsc. co daje kompilatorowi ogromne możliwości przenoszenia kodu w celu jego optymalizacji, ponieważ wie, że nie zmienia niczego, od czego zależy inny kod.
Współbieżny kod nie musi być synchronizowany, aby uzyskać dostęp do niezmiennych danych, więc współbieżność jest zwiększona, zarówno w systemach pamięci współdzielonej SMP (wszystkie dzisiejsze systemy wielordzeniowe), jak i w luźno powiązanych klastrach.
źródło
Oto kolejna zaleta: zmniejszone sprzężenie. Jeśli masz kod taki jak:
a gdzie indziej masz:
wówczas dwie funkcje są zależne pośrednio . Nie ma łatwego sposobu na stwierdzenie, że dzwonienie
doStuff
ma wpływ na połączeniadoOtherStuff
. Bez stanu zmiennego musisz jawnie określić połączenie.Oczywiście nie jest to problem ze wszystkimi stanami zmiennymi - problem dotyczy wszechobecnego stanu zmiennego. Prawdziwym rozwiązaniem jest domyślna niezmienność oraz pewien sposób „oznaczania” i ograniczania stanu zmienności do dokładnie tam, gdzie jest to potrzebne.
źródło
Uproszczona odpowiedź brzmi: kiedy widzisz nazwę w czysto funkcjonalnym języku, wiesz, czym jest powiązana wartość, poprzez proste sprawdzenie jej definicji. Jeśli masz zmienne zmienne, możesz tylko stwierdzić, które z kilku przypisań do niego zostało wykonane jako ostatnie, więc musisz także przeanalizować przepływ sterowania, który z kolei może być warunkowy, pozostawiając ci wiele możliwości. Aby uzyskać eksplozywną eksplozję, należy jedynie wziąć pod uwagę, że RHS przypisań same w sobie zależą od zmiennych, więc trzeba je również rekurencyjnie analizować.
Najważniejsze w powyższej analizie jest to, że nie da się tego obronić bez komentarzy wyjaśniających zamiar, niezmienniki i semantykę: mogą być trudne do interpretacji i może być trudne sprawdzenie, czy semantyka jest przestrzegana w rzeczywistym kodzie.
Ta odpowiedź jest w zasadzie rozwinięciem punktu 1 Javiera.
Myślę, że jest to również wyjaśnienie popularności nieuczciwego reżimu OO: w przypadku OO stan zmiennych jest enkapsulowany, co znacznie ułatwia analizę, lokalizując mutacje do pewnego stopnia i pozwalając na znacznie bardziej solidną ekspresję i weryfikację semantyki.
Należy zauważyć, że programowanie funkcjonalne nie jest odpowiedzią. Właściwą odpowiedzią jest system, który obsługuje zarówno programowanie indukcyjne (funkcjonalne), jak i koindukcyjne (proceduralne), dzięki czemu odpowiednie narzędzia mogą obsługiwać zarówno programowanie bezstanowe, jak i stanowe. Tyle tylko, że teoria konstruktywna (funkcjonalna) jest dobrze ugruntowana, podczas gdy teoria zarządzania państwem jest jeszcze w powijakach.
źródło
Jako autor Siege , DBMS napisanego w Haskell, niektórzy mogą nazwać mój pogląd na temat stanu zmiennego konfliktem. Mam nadzieję, że pokażę inaczej.
Celem stanu zmiennego jest opisanie bieżącego stanu, w którym znajduje się system. Załóżmy, że masz bloga i jest on zapleczem bazy danych, baza danych opisuje posty, które masz na swoim blogu w momencie zapytania to. Ile postów istnieje obecnie?
Porównaj to z niezmiennym stanem, który służy do przekazywania faktów. Ile postów było tam 12 sierpnia?
Fakty są łatwe do uzasadnienia, stan mutable nie. Zmienny stan nie jest jednak jakimś złym nieczystym efektem, który powinien zostać usunięty z zasięgu naszych umysłów; często potrzebujemy, aby współistniało w zmiennym świecie, w którym żyjemy, musimy tylko używać go oszczędniej.
źródło