dlaczego wszystkie samouczki programowania funkcjonalnego są takie matematyczne?

20

Próbowałem nauczyć się programowania funkcjonalnego i większość samouczków wykorzystuję matematykę jako przykłady bardziej skomplikowanych konstrukcji (nawet prostych w niektórych przypadkach). Dlaczego to? Wyobrażam sobie, że można użyć czegoś łatwiejszego. To utrudnia naukę.

Informacje podstawowe: Piszę oprogramowanie od 12 lat. Rozumiem niektóre pojęcia, takie jak zamknięcia, funkcje obywateli pierwszej klasy i leki generyczne. Być może mam problemy z funkcjami wyższego rzędu na pewnym poziomie zaawansowanym, ale chciałbym wierzyć, że mam podstawową wiedzę. Monady gryzą mnie w tyłek iw tym momencie jeszcze tego nie przeszedłem (jestem pewien, że w końcu to zrobię, ponieważ jestem wytrwały).

Charles Lambert
źródło
tylko trochę, nie próbowałem jeszcze 3 języków, które zasugerowałeś
Charles Lambert
F # jest najłatwiejszą rzeczą do uruchomienia, jeśli znasz C #. Nie zwróci duże matematyki wiedzy.
CND
6
Wypróbuj SICP - nie wykracza to zbytnio poza matematykę w szkole średniej.
SK-logiczny
@Charles Lambert - Go zegarek Życie biurowe i dostaniesz drugą część komentarza Hioba.
Jetti
@Charles Lambert: Naucz się Haskell dla wielkiego dobra nie jest zbyt matematyczny: D
Matthieu M.

Odpowiedzi:

21

Używają matematyki, ponieważ Programowanie Funkcjonalne jest bardzo dobre w modelowaniu konstrukcji matematycznych i jest ściśle powiązane z pojęciami matematycznymi, szczególnie Rachunkiem Lambda. Również, ponieważ I / O jest zazwyczaj dość drażliwym i zaawansowanym przedmiotem w wielu językach funkcjonalnej matematyki paradygmatu poprzez REPL różnych języków, na początku staje się dobrym sposobem nauczania języka.

Ponieważ funkcjonalne traktuje Programowanie funkcjonuje jako konstrukty pierwszych klas w obrębie języka programowania, funkcja pokolenie staje się bardzo ważne. Dlatego wyższa matematyka staje się dość ważna, szczególnie teoria grafów.

Języki imperatywne są tak samo matematyczne, ale u podstaw wszystko jest arytmetyczne, ponieważ są bliżej maszyny, którą i tak można dodać. Języki funkcjonalne z ich wyższej abstrakcji wydają się bardziej ku matematyce. Powszechne stosowanie w środowisku akademickim nie pomaga, gdyż w ten sposób przyzwyczaić i prowadzone przez ludzi, którzy wiedzą dużo matematyki i uczenie ludzi, którzy oczekują, aby dowiedzieć się dużo matematyki. Można więc powiedzieć, że można to „stłumić”, ale biorąc pod uwagę te czynniki, jest to mało prawdopodobne.

http://learnyouahaskell.com/ - jest prawdopodobnie jedną z najdelikatniejszych wstępów do Programowanie funkcyjne, ja dwukrotnie sprawdzane i nic poza podstawowym algebry i teorii grafów tam.

Inżynier świata
źródło
learnyousomeerlang.com jest również opcją, jeśli chcesz czegoś innego niż Haskell.
Travis
11

Istnieje wiele przyczyn i wszystkie one są ze sobą powiązane:

  • Większość funkcjonalnych języków programowania opracowano w kontekście akademickim, w którym CS jest ściśle związany z matematyką, więc ludzie, którzy je zaprojektowali, mają silne zaplecze matematyczne (i zwykle zakładają to samo o swoich odbiorcach)
  • Programowanie funkcjonalne jest paradygmatem szczególnie odpowiednim do rozwiązywania problemów matematycznych
  • Teoria leżąca u podstaw FP, rachunek lambda (w zasadzie abstrakcyjna teoria funkcji), jest gałęzią matematyki, a języki FP mają tendencję do używania pojęć i terminologii z rachunku lambda

Ponadto FP nie jest tak naprawdę bardziej matematyczna niż inne paradygmaty, ale kluczowe pojęcia (funkcje prawdziwych obywateli pierwszej klasy, funkcje wyższego rzędu, zamknięcia i czystość) wymagają pewnego sposobu myślenia. W pewnym momencie twój umysł powinien „kliknąć”; jeśli rozumieć te 4 główne idee, reszta może być tak proste, jak każdego innego paradygmatu.

tdammers
źródło
3
+1 dla opracowanych w środowisku akademickim: ludzie tworzący języki funkcjonalne opierają go na właściwościach matematycznych, więc przecieka ...
Matthieu M.
@ Matthieu M: Oparcie języka programowania na właściwościach matematycznych pomaga pisać poprawne oprogramowanie i skraca czas programowania. Na przykład zdecydowanie spędzam mniej czasu na debugowaniu kodu Haskell niż kodu C ++. Skrócenie czasu rozwoju (i kosztów) to ogromna praktyczna zaleta, która może uzasadnić wysiłek związany z nauką matematyki. Jak zauważyli tdammerzy, należy nauczyć się kilku dodatkowych koncepcji, ale po zrozumieniu kilku podstawowych pomysłów FP jest tak intuicyjna, jak programowanie imperatywne.
Giorgio
Zgadzam się również z tdammers że również języki imperatywne można opisać za pomocą pojęć matematycznych. W rzeczywistości opis matematyczny programu imperatywnego jest zwykle o wiele bardziej złożony niż opis matematyczny programu funkcjonalnego. IMO wyjaśnia, dlaczego języki rozkazujące częściej zawierają błędy: trudniej jest w pełni zrozumieć kod rozkazujący. Przynajmniej takie jest moje osobiste doświadczenie z kilkuletnim programowaniem funkcjonalnym i wieloma latami programowania imperatywnego.
Giorgio
@Giorgio: istnieje różnica między „wyciekiem do języka” (w jakiś sposób) a „wyciekiem do samouczka”. Jestem pewien, że mógłbyś napisać samouczek programowania funkcjonalnego bez tak dużej matematyki. Oczywiście kwestia, czy byliby lepsi, czy nie, jest przedmiotem dyskusji i prawdopodobnie subiektywna.
Matthieu M.,
@MatthieuM .: Bardzo dziękuję za wyjaśnienie, co masz na myśli przez wyciek (przejście do samouczka): Twój komentarz ma dla mnie teraz więcej sensu. Zgadzam się z tobą, że samouczek na temat FP powinien zawierać jak najmniej matematyki. I jakoś niewłaściwie zinterpretował swój komentarz: Pracując zarówno w przemyśle i na uniwersytetach jestem trochę przewrażliwiony na „w środowisku akademickim robią dużo matematyki, który jest bezużyteczny w świecie rzeczywistym” rodzaj komentarzy. +1 za komentarz i odpowiedź tdammera.
Giorgio
5

To dlatego, że zasadniczo programowanie komputerowe jest matematyką. Języki funkcjonalne zostały zaprojektowane z myślą o tym i dlatego wiele tutoriali koncentruje się na matematyce.

Trudno się nauczyć tylko wtedy, gdy nie jesteś przyzwyczajony do myślenia, że ​​programowanie komputerowe ma podstawy matematyczne.

Rudolf Olah
źródło
4
Zasadniczo informatyka jest kombinacją logiki i arytmetyki. To nie jest matematyka. Nie możesz wyrazić instrukcji rozgałęzienia w formule matematycznej - więc nie może być oparta na matematyce. Tłum programistów funkcjonalnych chciałby, aby opierał się on na matematyce, więc opracowują języki programowania, które zachowują się tak, jakby instrukcje gałęzi nie istniały.
James Anderson
9
@James Anderson, czy mówisz, że logika i arytmetyka nie są matematyką? Widziałem tony formuł matematycznych, które zawierają instrukcje dotyczące gałęzi (zwykle wyrażone w formalizmie przypominającym zmianę).
Peter Taylor
4
Arytmetyka podzbiór matematyki, który zajmuje się prostymi obliczeniami. Logika jest nadzbiorem matematyki, który jest podstawą wszelkiej racjonalnej myśli. Nawiasem mówiąc, programowanie funkcjonalne jest bardzo dobrym pomysłem do rozwiązywania problemów, które można wyrazić matematycznie; nie jest tak gorąco, gdy próbujesz postępować zgodnie z nielogicznym bałaganem arbitralnych zasad, takich jak GAP (ogólnie przyjęte praktyki rachunkowości)
James Anderson
6
@ ian31, jak zdefiniowałbyś słowo „ zasadniczo ”? Wiesz, inżynierii lądowej również opiera się na fizyce i matematyce, natomiast praktycznie to wszystko o budowaniu rzeczy dla ludzi do korzystania z programu. I każdy sposób, nawet przed rozpoczęciem myślenia o programowaniu rozwiązania jakiś problem w świecie rzeczywistym, to musi tłumaczyć ten problem do pewnego matematycznego formalizmu. To po prostu nie zadziała w drugą stronę. W programowaniu chodzi o formalizm.
SK-logic
6
@ ian31, języki programowania formalizmami. Ich zachowanie jest ściśle określone i przewidywalne. Zatem, kodowanie żadnego konkretnego modelu (nawet jeśli jest niejasne) jest przekształcenie go w formalizm swego. Matematyka dobrze skaluje się w tym mglistym obszarze, pomimo ogólnego postrzegania go jako ograniczonego do lśniącego, krystalicznie czystego świata o dobrze określonych ścisłych modelach.
SK-logic
1

Myślę, że „The Little Schemer” jest niesamowite wprowadzenie do programowania funkcyjnego i nie jest wcale Mathy. Nie wchodzi w Monady, więc może być zbyt podstawowy dla twoich gustów, ale robi pochodną kombinatora Y pod koniec.

Niedawno przeszedłem przez to, że nie uczyłem żadnego programowania funkcjonalnego od czasu college'u 12 lat temu, i było to świetne odświeżenie, zdecydowanie jestem gotów zająć się bardziej zaawansowanymi rzeczami po pracy z większością problemów w książce przy użyciu rakiety.

Paul Sanwald
źródło