Funkcjonalny jako pierwszy język

Odpowiedzi:

16

Jednym z głównych problemów jest to, że jeśli zaczniesz od języka takiego jak Haskell, wszystko inne będzie wydawało się niespełniające norm.

Szczerze mówiąc, myślę, że rozpoczęcie od języka takiego jak Haskell lub schemat byłoby świetnym pomysłem.

(Przyznaję, jestem uzależniony od języka funkcjonalnego) EDYCJA:

OK, co lubię w obu językach:

Schemat przyjmuje bardzo prosty język i tworzy z niego cudownie solidny język do programowania. Również SICP jest napisany o schemacie, dlatego warto się uczyć właśnie tam. Schemat dotyczy najprostszej rzeczy, jaką można sobie wyobrazić, która może być kompletnym językiem.

Haskell To, co naprawdę rośnie we mnie, to system czcionek. Tak wiele błędów, które widzę w innych językach, jest spowodowanych niewłaściwym typem pojawiania się gdzieś. W Haskell jest to prawie niemożliwe. Pomysł leniwego języka po prostu wypada z tego trochę fajnych rzeczy. Na przykład możesz utworzyć nieskończone struktury danych w Haskell, a następnie utworzyć tylko potrzebną część.

Zachary K.
źródło
Szczerze mówiąc, cała gama języków zawiera coraz więcej aspektów funkcjonalnych, więc życie nie jest tak złe, jak kiedyś.
Tikhon Jelvis
To prawda, a dla kogoś, kto kocha FP, jest to tylko dobra rzecz
Zachary K
3
Wiem - sugeruję to jako dobry powód do nauki FP. To trend, który bardzo mnie cieszy.
Tikhon Jelvis
Jednak tak naprawdę niewiele mówi, aby odpowiedzieć na pytanie - dlaczego lubisz Haskell (lub Schemat)? Czy byłyby dobre jako pierwsze języki do nauki? Dlaczego?
jimwise
Dodano komentarze na temat obu języków
Zachary K,
6

Największym plusem nauki języka funkcjonalnego przed rozpoczęciem nauki języka OOP jest to, że najpierw rozwija się umiejętności programowania, a następnie można łatwo zrozumieć koncepcje OOP. Jeśli zaczniesz od języka OOP, musisz nauczyć się dwóch rzeczy jednocześnie: „myśleć o kodzie” i „myśleć o OOD”. Może być rozpraszające. Najpierw ćwicz z funkcjonalnym językiem i rozwijaj swoje umiejętności programowania. Następnie naucz się OOP i innych paradygmatów. Ponieważ OOP opracowano w celu uzupełnienia braków w programowaniu strukturalnym, łatwiej będzie zrozumieć, dlaczego. Z tego powodu kursy CS zaczynają się od C, a następnie przechodzą do C ++.

DPD
źródło
1
Na mojej uczelni zaczęliśmy od funkcjonalnego języka Standard ML i dowiedzieliśmy się, jakie są skutki uboczne. Potem nauczyliśmy się C, ale nigdy nie nauczyliśmy się C ++.
Jonas
@Jonas. Myślę, że różne kraje / uniwersytety mają bardzo różne struktury kursów. Na moim uniwersytecie C, a następnie C ++ jest standardem dla kursów języka angielskiego w dziedzinie inżynierii komputerowej, ale dla innych strumieni inżynierii nauczane jest tylko C.
DPD
Na moim uniwersytecie zaczynamy od Javy, a potem po prostu używam języka odpowiedniego dla kursów. Na przykład C / C ++ jest używany do programowania systemów, C # dla interfejsu użytkownika, różne języki asemblera do organizacji komputerów i myślę, że cokolwiek chcesz do programowania gier
Carson Myers
Na mojej uczelni zaczęliśmy od nauki Scheme (z SICP). Pierwsze kilka tygodni było całkowicie funkcjonalne; OOP został dobrze wprowadzony do kursu. Myślałem, że wszystko zostało ułożone bardzo dobrze i raczej polubiłem ten kurs.
Tikhon Jelvis
6

Na pytanie, jak nauczyć się programowania, zaczynając od programowania funkcjonalnego, dwie klasyczne rekomendacje:

  • Pierwszym i oczywistym jest klasyczna struktura i interpretacja programów komputerowych autorstwa Abelsona i Sussmana, która pozostaje jednym z najlepszych wprowadzeń do CS i jest nauczana z funkcjonalnego punktu widzenia, przy użyciu schematu. Jest w pełni dostępny online . Jeśli nie zaczniesz tutaj, powinieneś się tu dostać.

  • Nowszym tekstem obejmującym większość tego samego terenu w łagodniejszym tempie i z większym naciskiem na inżynierię oprogramowania jest How to Design Programs , autorstwa Matthew Felleisen i kilku innych członków zespołu Racket / PLT, który używa dialektu Racket Schemat. Jest również dostępny online , podobnie jak druga edycja w toku . Zaletą tej książki jest to, że jest przeznaczona do użytku ze środowiskiem programistycznym DrRacket, które zapewnia bardzo przyjazny interfejs zarówno początkującym, jak i ekspertom do eksperymentowania z kodem.

Na pytanie, dlaczego zacząć od programowania funkcjonalnego, chciałbym wskazać na blogu Boba Harpera . Carnegie Mellon niedawno zmieniła program nauczania CS, aby uczyć najpierw programowania funkcjonalnego, a Harper relacjonował ich postępy na swoim blogu. Jako jeden z ludzi stojących za definicją Standard ML, oczywiste jest, że jest za tym posunięciem i dobrze uzasadnia jego powody.

Na koniec odradzam najpierw naukę Haskella, choć inni mogą się nie zgodzić. Podczas gdy czyste podejście Haskella do FP z pewnością rodzi dobre nawyki, koncentracja języka na leniwych obliczeniach niekoniecznie jest dobrym wyborem dla początkującego; Jedną z pierwszych i najważniejszych rzeczy, których musisz nauczyć się robić jako programista, jest rozmyślanie o tym, co robi Twój program, patrząc na źródło oraz o względnym koszcie różnych podejść do tego samego problemu. Z mojego doświadczenia wynika, że ​​lenistwo Haskella sprawia, że ​​obie te czynności stanowią wyzwanie dla nawet doświadczonych programistów, choć Twoje Przebieg może się różnić.

jimwise
źródło
5

Główną zaletą (lub, co nie jest wadą) rozpoczęcia pracy z FP, jest to, że większość pojęć może również dotyczyć programowania imperatywnego. Realm of Racket wykorzystuje analogie gier wideo do nauczania zarówno pojęć funkcjonalnych, jak i imperatywnych, a oddanym uczniom pozostawia nie tylko funkcjonalna gra (npi), ale także solidne zrozumienie warunków warunkowych, rekurencji, pętli, ADT i projektowania opartego na zdarzeniach. Te koncepcje są praktycznie wszechobecne we współczesnym programowaniu i są stale używane.

Jeszcze ważniejsze jest jednak nauczenie się kodowania abstrakcji , czegoś, co wyróżnia FP, z wykorzystaniem funkcji wyższego rzędu i typów danych. Jak projektować programy, zajmuje się tym wyjątkowe podejście poprzez nauczanie poprzez indukcję. Na przykład uczniowie uczą się, jak to folddziała, patrząc na kod pobierania zarówno sumy, jak i iloczynu listy, znajdując to, co ich łączy, i samodzielnie opracowując implementację.

Odpowiednik powyższego OOP prawdopodobnie obejmowałby jeden lub więcej z następujących elementów: interfejsy, klasy abstrakcyjne, generyczne, funktory lub (jeśli robisz to źle) singletony. Chociaż są to całkowicie akceptowalne wzorce projektowe w Javie, IMHO nie należą do wstępnego programu nauczania i służą jedynie zaciemnieniu podstawowych zasad. Nawet jako ktoś, kto został wprowadzony do języków FP „późno”, mogę powiedzieć, że poruszanie się po zmieniającym się morzu OOP jest znacznie łatwiejsze dzięki silnej kotwicy funkcjonalnej.

pluskwa
źródło
Prawie zapomniałem: jeśli chcesz kupić sferę rakieta, spróbuj ten kupon: RACKETEERS. Przepraszam, nie jestem pewien, kiedy wygasa.
błąd
+1 za wzmiankę o funkcjach wyższego rzędu - byłem gotowy opublikować własną odpowiedź na ich temat. Połowa moich współpracowników zmaga się z tą koncepcją, a reszta, którzy ją dostają, nie myśli o nich, kiedy byłoby to najprostsze rozwiązanie.
Izkata
1
Nie słyszałem o Realm of Racket, ale z tytułu od razu wiedziałem, co to jest, ponieważ tytuł nawiązuje do jego starszego brata, Land of Lisp.
Mag
4

Programowanie funkcjonalne znacznie ułatwia. W językach OOP musisz radzić sobie z zarządzaniem stanem w wielu wątkach bez rujnowania tego stanu. W językach funkcjonalnych, gdy większość wykonywanej pracy jest wykonywana za pomocą czystych funkcji, nie musisz się o to martwić.

Jeśli chodzi o szybkość / wydajność, nie jestem prawdziwym dżokejem wydajności, ale bycie funkcjonalnym nie oznacza bycia wolnym, a struktura języków funkcjonalnych ma niewiele wspólnego z ich szybkością. Składnia języków funkcjonalnych jest bardzo różna, na przykład różnice między Clojure i Haskell. Clojure jest bardzo szybki w obecnej postaci i może osiągnąć (a czasem nawet przekroczyć) prędkość Java z optymalizacją po fakcie.

Wszystko zależy od tego, czego szukasz

MattyD
źródło
2

Myślę, że dostępność materiałów do nauki, dobrych próbek kodu i mentorów jest bardzo ważna podczas nauki języków programowania. W zależności od twojej sytuacji możesz mieć mentora, który może cię uczyć itd. Myślę jednak, że funkcjonalnych zasobów językowych jest niewiele w porównaniu do języków głównego nurtu. Oznacza to, że będziesz postępował wolniej w porównaniu do nauki języków głównego nurtu. Ale jeśli się nie spieszysz, nie stanowi to problemu.

Endy Tjahjono
źródło
1
Myślę, że twoje założenia są błędne. Tam dobre tutoriale, książki, papier itp o rzeczy funkcjonalnej. Co więcej, istnieje wiele artykułów na temat specjalnych rzeczy, takich jak system pisma, implementacja, maszyny wirtualne, rachunek lambda i tak dalej.
Ingo
1

Być może najważniejszym powodem do rozważenia nauki funkcjonalnych języków programowania jest zrozumienie algebraicznych typów danych. Mapowanie mentalne pomoże w modelowaniu relacji klas OO, a nawet w projektowaniu baz danych.

Nacisk na systemy wielordzeniowe / wieloprocesorowe kładzie nacisk na stosowanie algorytmów równoległych, które można wyrazić jaśniej i bardziej zwięźle w FP. Gałąź języków lambda najprawdopodobniej znacznie wzrośnie w ciągu następnych dwudziestu lat.

Ale są też pewne typowe pułapki. Wierzyć, że FP jest prostsze, jest dużym błędem, ponieważ obliczanie złożoności przestrzeni i czasu, a także dostarczanie dowodów zatrzymania może być znacznie trudniejsze w rachunku lambda, szczególnie w językach, które obsługują leniwą ocenę.

Naucz się obu! A może lepiej: najpierw naucz się języka obejmującego oba, na przykład Scala. Jeśli nie masz nic przeciwko koszulkom typu tie-die i lekkiemu holenderskiemu akcentowi, być może przydatne będą wykłady dr. Erika Meijera na temat FP , które są dostępne na MSDN.

Dibbeke
źródło