Zmień sposób myślenia w przygotowaniu do programowania funkcjonalnego

9

Po przejściu na funkcjonalny styl programowania po przejściu z procedur i OOP, co muszę wiedzieć z góry na temat „tego nowego sposobu myślenia”?

Jak przygotowujesz się do nurkowania w świecie FP i jak go po raz pierwszy?

Jakie są podstawy do nauki i postawienia na pierwszym miejscu?

JohnDoDo
źródło
2
To zbyt ogólne, imho. Po prostu zacznij czytać! Większość książek i podręczników na temat programowania funkcjonalnego zaczyna się od odpowiedzi na twoje pytanie.
devmiles.com
Spróbuj, a następnie zadaj pytanie, jeśli utkniesz na czymś
Tom Squires
@Vladimir Volodin: Byłoby fajnie, ale nie jest to obowiązkowe w przypadku każdej książki. Czy możesz polecić jakieś dobre (najlepiej niezależnie od języka)?
JohnDoDo
Nie musisz nurkować . Możesz wypróbować wyrażenie lambda w języku OOP, takim jak c #, aby płynnie przejść z OOP do FP.
TomCaps
4
Myślę, że masz to wstecz. Spróbuj programowania funkcjonalnego, a twój sposób myślenia się zmieni.
kevin cline

Odpowiedzi:

6

Będziesz potrzebował myślenia deklaratywnego zamiast proceduralnego „najpierw zrób to, potem zrób to, a następnie zrób to ...” sposób rozwiązywania problemów. Zrozumienie rekurencji może być dobrym punktem wyjścia, ponieważ jest to swoisty punkt spoczynku między myśleniem proceduralnym a deklaratywnym.

Joonas Pulakka
źródło
4

Położyłeś wózek przed koniem. Nie musisz się przygotowywać. Po prostu wybierz język, który wygląda interesująco, znajdź dokumentację i spróbuj. Jeśli utkniesz, zatrzymaj się i poszukaj odpowiedzi. W miarę postępów twój sposób myślenia będzie się zmieniać.

Kevin Cline
źródło
3

FP opiera się na rachunku lamdba. Musisz to wiedzieć. To dobry punkt wyjścia. Funkcje są wszystkim. Nie ma pojęcia stanu (chociaż można go sfałszować na wyższym poziomie).

W OOP

a = 1 a = a + 1

jest akceptowane. Nie w FP. Po prostu nie możesz przypisać zmiennej innej wartości. Jeśli chcesz nauczyć się FP na dłuższą metę, naucz się Haskell. Jest to najczystsza wersja FP i jest też dość skomplikowana (dopiero zacząłem się jej uczyć), ale nadal warto się jej nauczyć.

Wprowadzenie do programowania funkcjonalnego daje ogólny przegląd tego, o co chodzi w FP.

Jednak dwa zastrzeżenia

  1. Jeśli chcesz nauczyć się FP dla miejsc pracy, nie ma tam zbyt wielu wolnych miejsc pracy. Proceduralne i OOP nadal rządzą rynkiem pracy. Ale FP może ci bardzo pomóc w odkrywaniu nowych sposobów rozwiązania problemu.
  2. Kompilatory FP nie są błyskawicznie szybkie. Ponieważ FP bardziej zależy na rozwiązaniu problemu, nie można oczekiwać prędkości C. Ale nadal możesz wydawać instrukcje kompilatorowi (w Haskell), aby przyspieszyć proces wykonywania. Kompromis polega na tym, że poświęcasz dużo czasu na skupienie się na programie, a nie na błędach przeciwpożarowych.
Ubermensch
źródło
8
„FP opiera się na rachunku lamdba. Musisz to wiedzieć”. Nie, ty nie. Znajomość rachunku lambda nie jest konieczna do zrozumienia programowania funkcjonalnego bardziej niż znajomość maszyn Turinga (lub montażu) jest konieczna do zrozumienia programowania imperatywnego.
sepp2k
@ sepp2k Aby być dobrym w FP z celem długoterminowym, szczerze wierzę, że nauka rachunku lambda jest konieczna. Możesz się tego nauczyć bez rachunku lambda, ale nauczenie się go sprawi, że będziesz lepszy w FP.
Ubermensch
2
FP z pewnością twierdzi, że taki stan jest zwykle niezmienny, nie jestem też pewien, czy zgadzam się z twierdzeniem, że kompilatory działają wolno
jk.
@jk. Z pewnością mają one stan, ale nie w sposób OO (stany mogą być zawarte w funkcjach lub jako pasujące wzorce i na bardziej subtelne sposoby). Niezmienny stan oznacza, że ​​masz tylko jeden stan. Dlatego funkcja zawsze powinna zwracać tę samą wartość. Jeśli chodzi o kompilatory, nie sądzę, że mogą one pasować do C / C ++ pod względem czystej prędkości, ponieważ kompilator zajmuje się etapami wymaganymi przy obliczaniu wyniku, zamiast określać kolejność. FP ma największą zaletę w postaci niższych kosztów programistów i przetwarzania równoległego niż czystej prędkości procesora.
Ubermensch
3

Staram się jak najlepiej zapamiętać następującą mantrę:

Dane wejściowe -> Przekształć dane -> Dane wyjściowe

lub

TransformData (Data In) -> Data Out

Ciemna noc
źródło
1
Powinno być TransformData (DataIn) -> DataOut
Ubermensch
:) jako matra „Data In, Transform Data, Data Out” łatwiej jest powiedzieć „TransformData, Open Bracket, Data In, Close Bracket, Data Out”. Żartuję. Zgadzam się z tobą.
Darknight
To tylko przyjacielski przyjaciel. Dzięki za odpowiedzi.
Ubermensch
Wiem, żartowałem tylko z tobą, bez obrazy, w rzeczywistości myślę, że zaktualizuję moją matrę.
Darknight
Człowieku, twój zestaw umiejętności jest dość duży.
Ubermensch