Jako mój pierwszy język programowania zdecydowałem się nauczyć języka Haskell. Jestem magistrem filozofii analitycznej i Haskell pozwolił mi szybko i poprawnie tworzyć interesujące programy, na przykład przetworniki do analizowania języka naturalnego, weryfikatory twierdzeń i interpretatory. Chociaż programuję dopiero od dwóch i pół miesiąca, okazało się, że semantyka i składnia Haskella są znacznie łatwiejsze do nauczenia niż bardziej tradycyjne języki imperatywne i czuję się komfortowo (teraz) z większością jej konstrukcji.
Programowanie w Haskell jest jednak jak magia i chciałbym poszerzyć swoją wiedzę o programowaniu. Chciałbym wybrać nowy język programowania do nauki, ale nie mam wystarczająco dużo czasu, aby wybrać dowolny język, porzucić go i powtórzyć. Pomyślałem więc, że postawię tutaj pytanie, wraz z kilkoma zastrzeżeniami dotyczącymi rodzaju języka, którego szukam. Niektóre są subiektywne, inne mają na celu ułatwienie przejścia z Haskella.
- Mocny system typów. Jedną z moich ulubionych części programowania w Haskell jest pisanie deklaracji typu. Pomaga to uporządkować moje przemyślenia na temat poszczególnych funkcji i ich związku z programem jako całością. Ułatwia również nieformalne rozumowanie o poprawności mojego programu. Martwię się o poprawność, a nie efektywność.
- Nacisk na rekursję, a nie na iterację. Używam konstrukcji iteracyjnych w Haskell, ale implementuję je rekurencyjnie. Jednak znacznie łatwiej jest zrozumieć strukturę funkcji rekurencyjnej niż skomplikowaną procedurę iteracyjną, zwłaszcza gdy używa się kombinatorów i funkcji wyższego rzędu, takich jak mapy, fałdy i wiązania.
- Warto się uczyć. Haskell jest satysfakcjonujące język do pracy. To trochę jak czytanie Kanta. Moje doświadczenie z C kilka lat temu jednak nie było. Nie szukam C. Język powinien narzucać interesujący koncepcyjnie paradygmat, którego w moim całkowicie subiektywnym przekonaniu nie lubi C.
Ważenie odpowiedzi : to oczywiście tylko notatki. Chciałbym tylko odpowiedzieć każdemu, kto udzielił dobrze sformułowanych odpowiedzi. Byłeś bardzo pomocny.
1) Kilka odpowiedzi wskazywało, że silny, statycznie typowany język z naciskiem na rekurencję oznacza inny język funkcjonalny. Chociaż chcę nadal mocno współpracować z Haskellem, camccann i larsmans słusznie wskazali, że inny taki język „za bardzo ułatwiłby przejście”. Te komentarze były bardzo pomocne, ponieważ nie chcę pisać Haskell w Caml! Spośród asystentów dowodu, Coq i Agda wyglądają interesująco. W szczególności Coq stanowiłby solidne wprowadzenie do logiki konstruktywnej i teorii typów formalnych. Spędziłem trochę czasu z predykatem pierwszego rzędu i logiką modalną (Mendellsohn, Enderton, niektórzy Hinman), więc prawdopodobnie miałbym dużo zabawy z Coq.
2) Inni mocno preferowali Lisp (Common Lisp, Scheme and Clojure). Z tego, co wiem, zarówno Common Lisp, jak i Scheme mają doskonały materiał wprowadzający ( On Lisp and The Reasoned Schemer , SICP ). Materiał w SICP skłania mnie do Scheme. W szczególności Schemat poprzez SICP obejmowałby inną strategię oceny, wdrażanie lenistwa i możliwość skupienia się na tematach takich jak kontynuacja, tłumacze ustni, obliczenia symboliczne i tak dalej. Wreszcie, jak zauważyli inni, podejście Lispa do kodu / danych byłoby całkowicie nowe. Dlatego skłaniam się mocno w stronę opcji (2), Lispa.
3) Po trzecie, Prolog. Prolog ma bogactwo interesujących materiałów, a jego główna domena jest dokładnie tą, która mnie interesuje. Ma prostą składnię i jest łatwa do odczytania. W tej chwili nie mogę nic więcej komentować, ale po przeczytaniu przeglądu Prologu i przejrzeniu kilku materiałów wprowadzających, otrzymałem wynik (2). Wygląda na to, że Haskell zawsze hakuje cofanie się Prologa!
4) Spośród języków głównego nurtu Python wygląda najciekawiej. Tim Yates sprawia, że języki brzmią bardzo atrakcyjnie. Najwyraźniej Python jest często nauczany na pierwszym roku specjalizacji CS; więc jest albo bogata koncepcyjnie, albo łatwa do nauczenia. Musiałbym przeprowadzić więcej badań.
Dziękuję wszystkim za rekomendacje! Wygląda na to, że Lisp (Scheme, Clojure), Prolog lub asystent dowodu, taki jak Coq lub Agda, są głównymi zalecanymi językami.