Jaki byłby dobry pierwszy funkcjonalny projekt programistyczny? [Zamknięte]

19

Jaki byłby dobry pierwszy funkcjonalny projekt programistyczny?

Chcę zakończyć hukiem mojego projektu licencjackiego i chcę go zakończyć funkcjonalnym projektem programistycznym. Nie uczyć się go w szkole, ale jesteśmy zachęcani, aby spróbować nauczyć się nowych rzeczy siebie i pomyślałem, uczenie się nowego paradygmatu nie tylko nowy język byłby doskonałym ćwiczeniem dla mnie, i zapewne coś ciekawego dla nauczycieli, aby zobaczyć zbyt ,

Problemem jest to, chcę zacząć trochę z wyprzedzeniem o moim projekcie, aby skorzystać z letniego wypoczynku i uzyskać lepsze zrozumienie na temat programowania funkcjonalnego i zapoznać się z jednego języka.

Co byś powiedział, byłoby to projekt dobrą praktyką, która jest nieco trudne, ale także pozwala mi uczyć się języka, paradygmat itd A potem co można by pomyśleć, byłoby to projekt dobry (bardziej zaawansowany jeden) do mojego projektu kawalerskim?

Docenione zostaną również sugestie dotyczące najlepszego języka na początek podczas programowania funkcjonalnego.

Ja ja
źródło
1
„Jaki język powinienem wybrać” i pytania dotyczące wyboru projektów są tutaj nie na temat. Więcej informacji znajduje się w FAQ i tej meta dyskusji .
Adam Lear

Odpowiedzi:

10

To generalnie łatwiejsze, jeśli na coś stosunkowo matematycznych lub logicznych - języki programowania funkcjonalne są na ogół dobrze nadaje się do zastosowań, które stanowią pewną formę transformacji z danego wejścia do wyjścia.

Kilka pomysłów, w przybliżeniu według stopnia trudności:

  • Algorytmy genetyczne - napisz program, który ewoluuje rozwiązania do określonego zadania, w którym rozwiązania są reprezentowane w prostej DSL. Bawiłem się, zanim zbudowałem małe boty, które polują na żywność w siatce 2D i opracowują różne rodzaje strategii

  • Parsing combinators - zbuduj bibliotekę parsera kombinatora, która pozwoli ci zbudować parser dla dowolnego języka za pomocą funkcji wyższego rzędu.

  • Jeśli naprawdę chcesz wyzwania, możesz spróbować napisać grę komputerową ... pamiętaj, że jest to trudne zadanie, ponieważ gry mają ogromną liczbę zmiennych stanów, które mogą być trudne w zarządzaniu w funkcjonalnym stylu programowania. Oczekiwać, aby dowiedzieć się więcej niż kiedykolwiek chciałeś wiedzieć o monady etc .....

Polecam Clojure jako pragmatycznego języka funkcjonalnego. Używałem go przez około 18 miesięcy i jestem bardzo zadowolony z wyboru. Główne powody to:

  • Współbieżność - Clojure ma niesamowity system STM, który moim zdaniem sprawia, że ​​jest to obecnie najlepszy język na świecie dla współbieżności wielordzeniowej. Zobacz wideo na: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey, jeśli chcesz zrozumieć, dlaczego jest to tak wyjątkowe
  • To Lisp - więc z powodu filozofii „kod to dane” jest fantastyczny w metaprogramowaniu opartym na makrach (programy, które piszą programy, algorytmy genetyczne itp.)
  • Pragmatyczne programowanie funkcjonalne - styl Clojure jest bardzo funkcjonalny (duży nacisk na funkcje wyższego rzędu, leniwe sekwencje itp.), Ale nie jest całkowicie czysty jak Haskell. Istnieje wiele miłych narzędzi do obsługi mtable państwowych i boczne Efects
  • Dynamiczny - Clojure jest domyślnie językiem dynamicznym. Uważam to za duży wzrost wydajności. Jednakże, można ewentualnie dodać statyczne podpowiedzi typu później, jeśli chcesz korzyści wydajnościowe typowania statycznego.
  • Całkowicie skompilowany - kod Clojure jest zawsze przestrzegane (nawet jeśli nie jest „eval”), dzięki czemu można uzyskać całkiem przyzwoite osiągi - na pewno lepiej niż większość języków dynamicznych Użyłem.
  • Otrzymujesz dostęp do wszystkich bibliotek i narzędzi w ekosystemie JVM za darmo. W przeciwieństwie do języków akademickich, które mają bardzo ograniczone biblioteki, możesz łatwo uzyskać dostęp do wszystkiego we wszechświecie Java

Możesz bardzo łatwo wypróbować podstawy dzięki:

mikera
źródło
Wybrałem swoją odpowiedź na pytanie, ponieważ odpowiedział na wszystkie moje pytania. Dziękuję bardzo za poświęcenie czasu.
Meme
Haskell ma zbyt STM; (
alternatywa
@mikera: Do pracy z JVM, czy próbowałeś ABCL? Próbowałem go i wykonane tylko mały przykład, ale mam prawie żadnego doświadczenia z nim. (Mam też książkę Clojure na mojej liście rzeczy do zrobienia, ale to już inna historia, jestem ciekawy, czy masz jakieś doświadczenie w pracy z ABCL i Java).
Giorgio
@Giorgio: ABCL Wygląda na to przyzwoity implementacja Common Lisp na JVM. OTOH Clojure ma zalety są przeznaczone dla JVM, zawierające dużo bardziej „nowoczesne” innowacje i mając więcej społeczności rozpędu. Myślę, że tak naprawdę sprowadza się do tego, czy zależy Ci na zachowaniu kompatybilności wstecznej Common Lisp czy nie.
mikera
9

Zanim zaczniesz myśleć o konkretnych projektach, zacznij od nauki podstaw programowania funkcyjnego, dzięki czemu można mieć dobry pomysł z typów projektów, które byłyby dobre dopasowanie.

Najlepszym miejscem do rozpoczęcia jest prawdopodobnie Struktura i interpretacja programów komputerowych (SICP), który jest oparty na dialekcie schemat Lisp. Jest to klasyczny tekst CS, a pełny tekst jest dostępny online (link podany).

Jeśli chcesz dostać się kręci, i użyć bardziej nowoczesny język funkcjonalny kierowaną JVM, przyjrzeć Clojure. Istnieje nawet dostosowana wersja SICP specjalnie dla Clojure .

Idąc nad tekstem SICP, można zorientować się, dlaczego programowanie funkcjonalny jest tak dobrze nadaje się do pewnych typów zadań, ćwiczenia i może inspirować się pełnoprawnym projektu. Jeśli zdecydujesz się pójść drogą Clojure i chcą zbadać niektóre istniejące projekty, istnieją pewne linki dobre tutaj .

Jason Lewis
źródło
Dziękujemy za podanie linku do książki. Przeczytam to, aby lepiej zrozumieć.
Meme
Czy przeczytałeś dzisiaj SICP?
MattyD
3

Analiza ilościowa

Jeśli uważasz, że finanse są dość interesujące, wykonywanie pewnych zadań ilościowych za pomocą programowania funkcjonalnego jest dobrym rozwiązaniem, ponieważ jest bardzo algorytmiczne. Mówię o teorii portfela i takich rzeczach, jak wskaźniki Sharpe i Sortino itp. Stwórz aplikację, która analizuje zwroty z funduszu i daje różne statystyki, diagramy itp.

Polecam F # tylko dlatego, że myślę, że jest to łatwy język funkcjonalny na początek, ma dobre narzędzia i dobrą platformę. Inne alternatywy to seplenienie i clojure, ale trudniej się ich nauczyć.

Homde
źródło
Na wysokim poziomie prawdą jest, że możesz robić wiele rzeczy w funkcjonalny sposób. Ludzie używali na przykład języków funkcjonalnych do opisywania egzotycznych wypłat opcji. Ale gdy schodzisz do rzeczy na poziomie gruntu, takich jak obliczanie PCA, rozwiązywanie równań nieliniowych itp., Algorytmy stają się coraz bardziej iteracyjne i lepiej kodować je w starym stylu.
quant_dev
1
Nie powiedziałbym tego, z mojego doświadczenia wynika, że ​​analiza ilościowa polega na uruchamianiu algorytmów w szeregu. Wdrożyłem ilościowe rzeczy w języku C # i było to bardzo zgodne z LINQ, przynajmniej w przypadku teorii portfela
Homde
Co z implementacjami samych algorytmów?
quant_dev
W większości przypadków nie widzę problemu. Weź obliczania współczynnika Sharpe'a, najpierw obliczyć rocznym powrocie z serii zwrotów, a następnie użyć tej wartości za pomocą stopy wolnej od ryzyka i zmienności (annualizedReturn - riskFreeRate) / zmienność. Nic język funkcjonalny nie poradzi
Homde
Co z kalibracją modelu wyceny?
quant_dev
3

Na początek możesz spróbować zaimplementować małą grę w blackjacka w F #. To jest zadanie domowe przypisane podczas tego krótkiego samouczka wideo . Rozwiązanie jest również dostępne w sieci (oraz w jednym z filmów).

knb
źródło
2

Możesz napisać tłumacza dla schematu lub seplenienia z OCaml.

davidk01
źródło
Należy również zauważyć, że istnieje nawet książka haskell na ten temat na temat pisania schematów w haskell.
alternatywnie
2

Który język funkcjonalny byłaś myśli. Każdy ma inną charakterystykę. Jedynym językiem, który wywarł na mnie największy wpływ, był Haskell i sugerowałbym, abyś zrobił to samo.


źródło
Myślałam o F # szczerze głównie dlatego, że w Danii Microsoft wszystkiego jest popularne, ale im więcej czytałem różne opinie, jestem wątpić tej decyzji. Chcę języka, który pomoże mi przede wszystkim nauczyć się tego paradygmatu, a po tym, jak jestem pewien, nie będzie trudno nauczyć się innego, jeśli będę tego potrzebować.
Meme
Silnie zależy od tego, gdzie jesteś i co robisz. Do programowania nam Microsoft technologie są bezużyteczne, ponieważ nie obsługują naszą główną platformę. Ale dygresję: jeśli chcesz użyć F #, świetnie, ale potem otwórz nowe pytanie specyficzne dla F #.
Nie chcę, aby użyć. I nie podjęły jeszcze decyzji. Pytanie o język używany był wtórny jeden zresztą.
Meme
W takim przypadku znaleźć projekt, a następnie poprosić o zalecenia jak go rozwiązać. Np Prolog jest dobre dla przeszukiwania drzewa decyzyjnego. Haskell jest idealne dla wyszukiwania wzorca. Lisp jest dobre dla konstruowania programów Lisp i manipulowania w czasie wykonywania w zależności od Twoich danych.
0

Można również przyczynić się do pewnego projektu open source.

Na przykład, w języku programowania Frege projektu, jest wiele do zrobienia. Dla przykładu, można dbać o przenoszeniu bazy bibliotek Haskell. To sprawi, że swego rodzaju ekspertem Haskell podczas pracy na nim.

Ingo
źródło