Odpowiedzi:
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ęść.
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 ++.
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ć.
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 fold
dział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.
RACKETEERS
. Przepraszam, nie jestem pewien, kiedy wygasa.
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
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.
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.