Wprowadzenie programowania funkcjonalnego do środowiska programistycznego [zamknięte]

15

To długa historia, ale postaram się streścić ją najlepiej jak potrafię. Jesteśmy sklepem .NET, który pisze oprogramowanie dla różnych rodzajów funduszy. Na przykład piszemy oprogramowanie do zarządzania roszczeniami zdrowotnymi, oprogramowanie do zarządzania emeryturami, oprogramowanie 401 (k) i inne rzeczy o charakterze finansowym.

Teraz wkraczamy w nową dziedzinę: prace pochodne i analizy ilościowe, co wydaje się bardzo ekscytujące. To powiedziano mi w ciągu najbliższych 8-12 miesięcy.

Teraz sam nauczyłem się programowania funkcyjnego, głównie powierzchowne spojrzenia na różne języki za pośrednictwem tej książki, ale nigdy tak naprawdę nie zagłębiłem się w nią. Teraz, ponieważ jesteśmy sklepem .NET, myślałem, że F # może być dobrym wyborem, ponieważ możemy potencjalnie wykorzystać niektóre biblioteki .NET i istniejącą wiedzę.

Moje pytanie brzmi: od czego zacząć? Bardzo trudno mi ustalić, czy powinienem pójść z Haskellem, Erlangiem, Scalą, F # itd. Wszyscy wydają się bardzo interesujący i zdolni, i szczerze mówiąc, może to być dobra okazja, aby zerwać z uzależnieniem od Microsoftu.

Czy ktoś miał podobną sytuację? Jeśli tak, jakie było Twoje doświadczenie związane z przejściem do funkcjonalnego i co wybrałeś i dlaczego? Wiem, że to dość duże pytanie, ale nie znam żadnych programistów, którzy używają metod funkcjonalnych w tej chwili, więc nie mam innego miejsca, jak nieustannie obracać się poza Googlingiem i wszędzie znaleźć wojny płomieni w najlepszym funkcjonalnym języku.

Nodey The Node Guy
źródło
zalecana lektura: Od czego zacząć
komnata

Odpowiedzi:

14

Prototyp, prototyp, prototyp! Weź jedną funkcjonalność biznesową, która Twoim zdaniem wymaga programowania funkcjonalnego, wypróbuj różne języki i sprawdź, czy naprawdę dają one korzyści i interoperacyjność, której szukasz.

Martijn Verburg
źródło
Dobra rada i posłucham tego, w rzeczywistości robię teraz instalację Erlanga, aby spróbować.
Nodey The Node Guy
10

Pierwszym pytaniem, na które naprawdę musisz odpowiedzieć zgodnie z prawdą, jest to, dlaczego rozważasz użycie funkcjonalnego języka. Jeśli nie możesz uzasadnić biznesowej przyczyny zmiany, nie powinieneś tego robić. Innymi słowy, chęć wprowadzenia nowej struktury, języka lub innej nowej technologii do środowiska pracy tylko dlatego, że chcesz się jej nauczyć lub dlatego, że wydaje się, że kolejna „fajna” rzecz jest zdecydowanie błędem. Musisz więc najpierw rzetelnie zapytać, jaka jest motywacja.

Jeśli naprawdę uważasz, że potrzebujesz funkcjonalnego języka, aby rozwiązać konkretny problem, i zakładając, że większość popularnych języków funkcjonalnych spełni twoje wymagania, wybrałbym najbardziej dojrzały i ten z największą społecznością użytkowników. Erlang to dobry wybór i spełnia oba te wymagania, jednak w środowisku czysto ms / .NET rozumiem za pomocą F #.

ennuikiller
źródło
2
@ ennukiller - Zdecydowanie widzę, że programowanie funkcjonalne byłoby dla nas dobrym wyborem i nie zamierzam kłamać - chciałbym również używać go tylko do czystej stymulacji intelektualnej, jaką zapewni. Będziemy robić ogromne ilości obliczeń i chcę skorzystać z wielordzeniowego. Ponadto konieczne jest, aby każda funkcja matematyczna została udowodniona, rozumiem, że może być łatwiejsze z funkcją.
Nodey The Node Guy
2
Jeśli potrzebujesz dowodów, czyste programowanie funkcyjne jest najlepszy. Niektóre sugestie dotyczą funkcjonalnych dodatków do języków imperatywnych - mogą być bardziej znane, ale nie dadzą możliwego do poprawienia kodu. W obecności efektów ubocznych nie można użyć faktu, że x = x („przejrzystość referencyjna”), i trzeba udowodnić, że x później w kodzie nadal ma taką samą wartość jak wcześniej. Na przykład w niektórych językach może się zdarzyć, że x:=3; y:=10; x:=add(x,x);wynikiem jest wartość xinna niż 6, a yinna niż 10. Udowodnienie, że funkcje są prawidłowe w tym kontekście, jest niepraktyczne.
AndrewC,
9

Zdecydowanie zgodziłbym się z F # dla sklepu z istniejącą bazą kodów .Net, podobnie jak zdecydowanie zgadzam się ze Scalą dla sklepu z istniejącą bazą kodu Java.

Programowanie funkcjonalne to narzędzie jak każde inne. Dobrze używany i zintegrowany z tym, jak już tworzysz kod, może zwiększyć produktywność, ułatwiając rozumowanie tego, co robi Twój kod. Jednak zmiana języka jest daleka od darmowej, więc najlepszym rozwiązaniem jest rozwiązanie, które pozwala wykorzystać jak najwięcej istniejącego kodu przez jak najdłuższy okres przejścia. W końcu najpewniejszym sposobem, aby nie wprowadzić nowego języka do swojego środowiska, jest poinformowanie współpracowników, że muszą przepisać wszystko, co do tej pory mieli, aby zobaczyć zalety zmiany, która w tym momencie wciąż próbujesz je sprzedać.

jimwise
źródło
7

Poleciłbym rozpocząć programowanie funkcjonalne bez natychmiastowej nauki nowego języka. To tylko utrudnia, jeśli próbujesz nauczyć się nowego paradygmatu, gdy próbujesz również opanować składnię nowego języka.

Oczywiście języki, które zostały specjalnie opracowane do programowania funkcjonalnego, będą miały pewne zalety (takie jak specyficzne konstrukcje, takie jak rozumienie i domyślnie niezmienne struktury danych), ale generalnie największym krokiem jest zmiana sposobu myślenia na funkcjonalny styl. C # świetnie się do tego nadaje.

Zasadniczo po prostu przestajesz zmieniać stan swojego kodu. Zrobiłem to za pomocą Java i jest jeszcze łatwiejsze w C #, ponieważ masz lambdas. Kiedy już zrozumiesz ten styl i wyczujesz, do czego jest dobry, bardzo łatwo będzie wybrać funkcjonalny język (niezależnie od tego, czy wybierzesz F #, czy Erlang) i będziesz z nim niezwykle produktywny.

Deckard
źródło
1
+1: Zgadzam się z tobą. Zacząłem także kodować w bardziej funkcjonalnym stylu w Javie i C ++ (używając więcej zmiennych końcowych i stałych, przerywając skomplikowane operacje przy użyciu składu funkcji itd.). Myślę, że to zdecydowanie poprawiło mój styl programowania w Javie i C ++. Po pewnym czasie, gdy czuje się gotowy na pójście dalej, można wypróbować funkcjonalny język (Haskell, Ocaml, SML, Lisp, Scala, F # itp.)
Giorgio
1

Jeśli chcesz tylko nauczyć się programowania funkcjonalnego, po prostu zainstaluj IronPython i skup się na funkcjach w Pythonie. W najgorszym przypadku poznasz narzędzie, które można zintegrować z C #, aby zmniejszyć liczbę wierszy kodu w aplikacji i pomóc w dostarczaniu większej liczby produktów bez błędów przed terminem.

Zapoznaj się z prezentacjami DaBeaz na temat generatorów, aby zobaczyć, jak podejście funkcjonalne w Pythonie może uprościć złożone rzeczy http://www.dabeaz.com/generators/

Poza tym myślę, że rozsądnie byłoby zainwestować trochę czasu w Scali. Działa na platformie .NET w trybie beta, dzięki czemu można go zainstalować i używać go dzisiaj do celów edukacyjnych, a do jesieni będzie dostępny w wersji dla platformy .NET. Oznacza to, że możesz pisać kod w Scali, który jest przenośny w JVM i .NET. A ponieważ Scala opiera się na Aktorach i przekazywaniu wiadomości, bardzo, bardzo łatwo jest zbudować aplikację złożoną z kilku oddzielnych programów działających na kilku osobnych maszynach. Po dodaniu przenośności .NET / JVM do miksu należy rozważyć jeszcze jeden aspekt. Możesz mieć jedną aplikację, która korzysta zarówno z zewnętrznych bibliotek Java, jak i z zewnętrznych bibliotek .NET, bez bałagania się przy opracowywaniu protokołów umożliwiających im komunikację. Oba procesy zostaną zapisane w Scali, i używałby zdalnej komunikacji Scala (zdalni aktorzy) do komunikacji. Sprawdź bibliotekę Akka, która wydaje się, że ostatecznie stanie się częścią standardowej biblioteki Scali, sądząc po tym, co robią Typesafe.com.

Michael Dillon
źródło
+1: Za wspomnienie o Scali i jej dostępności na różnych platformach. Pytanie: czy Akka zastąpi obecne wdrożenie aktora w Scali? Czy będą istnieć obok siebie?
Giorgio
Nie jestem pewien, czy Akka wkrótce zastąpi obecnych aktorów Scali, ale twórca Scali, Martin Odersky, dołączył do twórcy Akki, Jonasa Bonera w firmie Typesafe. Silnie promują Scalę w Akka, a teraz w ramach Play. Jest więc prawdopodobne, że rozwój skupi się na Akka. Jeśli uczysz się aktorów ze Scalą, najlepiej skoncentrować się na Akce.
Michael Dillon
Dzięki wielkie za informację! Spojrzałem na aktorów ze Scali, ale do tej pory tylko bardzo powierzchownych.
Giorgio
-1

Z pewnością zgadzam się z głównym założeniem przyjętej odpowiedzi, a biorąc pod uwagę, że po prostu nurkujesz na dobre, dając Erlangowi szansę, brzmi to tak, jakbyś prawdopodobnie miał całkiem dobre zrozumienie tego, jak się uczysz i po prostu potrzebował trochę troche w prawo kierunek, tak wyraźnie, że była to dla ciebie dobra odpowiedź ... Ale myślę, że podszedłbym do tego pytania nieco inaczej, ponieważ widzę, że ta odpowiedź wcale by mi nie pomogła; Zawsze koduję, by się uczyć! Oto moje myśli ...

(BTW, staram się pisać bardziej szczegółowo, powiedzmy, rozdziały w książce, i jestem pewien, że nie mogę tutaj całkowicie stłumić swoich instynktów , ale zamierzam spróbować innego rozwiązania; streszczę tutaj moje przemyślenia, a jeśli ktoś chciałby uzyskać więcej szczegółów na temat czegoś lub uważa, że ​​coś, co mówię, jest mylące w tym formacie, postaram się jak najlepiej przypomnieć sobie przypomnienia o odpowiedziach ...)

Aby spróbować utrzymać się na zadaniu, oto moje zrozumienie podstawowych pytań zadawanych w PO; Ograniczę się do minimum, aby wyjaśnić ...

Najpierw szybkie odpowiedzi:

czy byłem w podobnej sytuacji? To było co najmniej podobne; Byłem na pierwszym miejscu, wykonując wiele różnorodnych projektów, które były ze sobą powiązane ... (CRM / Web / DB / Data Integration / etc.)

jak / dlaczego przeszedłem do funkcjonalnego? ” Widziałem kilka przykładów LINQ i chociaż zdecydowanie marzyłem o jakimś zintegrowanym, statycznie typowanym języku zapytań [ponieważ korzystałem głównie z języków o typie statycznym (głównie C ++, a później C # )] przez całą moją karierę ... Ale to było dość szybkie środowisko pożarowe, w którym się znajdowałem, i chociaż często zdarzyło mi się zobaczyć, co nadchodzi w przeszłości, nigdy tak naprawdę tego nie przemyślałem, więc nigdy nie przewidziałem, że to mógł / pozwoliłby na operacje na Plain Old Objects (lol!) równie łatwo; kiedy to zobaczyłem, wiedziałem, że muszę go mieć ... więc to jest powód i początek tego: skupiłem się na nauce zrozumienia LINQ .

Cztery myśli ... eeee, nie, to nie w porządku ...

Kiedy czytam odpowiedź Martijna Verburga , wzmianka o funkcjonalności biznesowej od razu przypomina mi o rozpoczęciu wdrażania kodu do wszystkiego, nad czym pracuję ... W zależności od tego, jak płytkie było to początkowe eksperymentowanie, mogłem odpowiedzieć inaczej, ale zakładając, że to tylko zanurzając swój duży palec u nogi, nie jestem pewien, czy miałem coś bezpośrednio do pracy (lub przyszłej pracy), która dostarczyłaby mi podniecenia / pasji, którą, jak sądzę, powinieneś prawdopodobnie mieć z powodu kilku pierwszych problemów, z którymi zaczniesz się uporać ...

Byłem uziemiony prawie całkowicie w statycznie typowanych językach + metaforach i wzorcach OOP + cokolwiek, co skończyło się przypadkowym owijaniem mózgu podczas rozwiązywania moich rzeczywistych problemów przez lata ... Chodzi o to, że jeśli w ogóle jesteś taki jak ja, prawdopodobnie masz dużo mózgu poświęconego rzeczom, które nie pomogą ci tak bardzo z LINQ / FP.

Myślę o tym jak o programowaniu czysto proceduralnym vs. OO: jest wiele rzeczy proceduralnych, których będziesz używać w OOP, ale ci, którzy przychodzą do C ++ z C bez priorytetowego traktowania grok / ken / "get" OO w końcu jest bardzo źle w C ++. Właściwie przeprowadziłem wywiad z wieloma (15+) długoletnimi twórcami oprogramowania i sterowników urządzeń, którzy naprawdę myśleli, że znają C ++, ale co najwyżej mieli bardzo podstawową / podręcznikową znajomość C ++, praktycznie nie rozumiejąc lub doświadczenie w OOP - ponieważ nigdy tak naprawdę nie robili OOP ... Pisali wielozadaniowe klasy singleton z elementami statycznymi i funkcjami statycznymi z pewną ilością klas niestatycznych / nie singletonowych, które były używane jako struktury.

I FP ma podobne, zadziwiające (dla tych, którzy nie wychodzą na paradygmacie) koncepcje i inne rzeczy, które się z tym zgadzają, i (chociaż uznałem, że hybrydyzacja wielu technik jest dla mnie idealna) rozumiem więcej i w miarę upływu czasu, dokładnie jak ograniczone było moje myślenie przed wprowadzeniem prawdziwych zdolności funkcjonalnych do mojego zestawu narzędzi; W przeszłości udało mi się wdrożyć wiele rzeczy w sposób, który był nieco bardziej kreatywny niż być może większości programistów OO, ale kiedy używam koncepcji, jak wcześniej moje myślenie było zahamowane ... Istnieje wiele klas problemów, które można rozwiązać w kilku wierszach, które zajmowały dużo czasu w C ++ / C #.

nagle znajdujesz się ...

We wpisie „Too Long”

Jesteś w labiryncie krętych „nie czytałem”, podobnie.

W niedalekiej przyszłości zobaczysz telekonferencję, która szybko się zbliża.
> zwięzłe
UH Huh. Pewnie. Ok, powiemy, że tryb „zwięzły” jest włączony.

W niedalekiej przyszłości zobaczysz telekonferencję, która szybko się zbliża.
> co to ma znaczyć?
Tylko mówię'. Nie musiałeś dziś rano coś robić?

W niedalekiej przyszłości zobaczysz telekonferencję, która szybko się zbliża. 
> hej, czy to jest zaleta za tobą?
Co!? GDZIE?! [ucieka krzycząc]

> Przepraszam, nie rozumiem CO GDZIE, przeformułowanie?
[kontynuuje bieganie i krzyczenie, sarkazm niezauważony]

Więc ... Czego powinienem się nauczyć, drogi PSE, drogi PSE?

Osobiście zacząłem w C # z LINQ. Pozwoliło mi to przedstawić kilka pojęć naraz, a podczas gdy ciągle czytałem o FP i jego koncepcjach, a także o LINQ i relacjach między nimi, dałem mi krok naprzód, wciąż wykonując produktywną pracę. Dodałem kilka rzeczy na raz, zapytania danych szybko stały się dla mnie użytecznym narzędziem bez konieczności rozumienia tony.

Teraz, patrząc wstecz, żałuję, że nie byłam w stanie wykonać następnego projektu (rozwiązanego około rok później); Średnio zapoznałem się z F # (który, nawiasem mówiąc, dał mi świetny start w nauce ML (metaljęzyka) i jego innych pochodnych (np. OCaml .)

Zasadniczo myślę, że przyzwoita odpowiedź na „co” zależy od znalezienia dobrego parowania jakiegoś problemu programistycznego, który Cię interesuje, ale oczywiście musi się sparować z odrobiną FP, której chcesz się nauczyć ... (i możesz spłukać / powtórz / spień po wykreśleniu czegoś z listy ...) I oczywiście zawsze kończysz się uczeniem czegoś więcej niż najważniejszej rzeczy, którą postanowiłeś zrobić; na początku zrobiłem kilka kroków dla dzieci, ale potem skończyłem robić większe rzeczy i pozwalać mniejszym rzeczom wpaść na miejsce, kiedy to robiłem.

Po pierwsze, co unosi twoją łódź? Zwłaszcza na początku najlepiej jest mieć coś zabawnego i ekscytującego (dla Ciebie), dzięki czemu zainteresowanie pozostanie wystarczające, aby było dla ciebie opłacalne. Więc problemy z IOW do pracy i techniki, które rozwiązują te problemy ... LINQ i wbudowane zapytania danych na początku dla mnie. Rekurencja była dla mnie kolejna, w tym rekurencja ogona, kopię GodelEscherBach-ness tego; i czytałem o rekurencji ogona. W tym czasie rzeczy, nad którymi pracowałem, zostały zawieszone i skończyło się to dużym blokiem czasu, więc byłem w stanie utrzymać się przez długi czas. Łatwiej było z mniejszymi przerwami, ale ponieważ wybrałem rzeczy, które uważałem za zabawne, nie było tak trudne nawet z przerwą w pracy. :)

I chociaż nie wymyśliłem nic fajnego, o czym mogę powiedzieć, jak samoświadomy Program Kraba, udało mi się być w tym całkiem niezłym.

I ... Z czym mam się tego nauczyć, drogi PSE, drogi PSE, z czym?

Użyłem do tego różnych algorytmów, które i tak mnie interesowały, a także różnych rzeczy, zastanawiałem się, czy możesz to zrobić w F #, a kiedy zabraknie mi pomysłów, zajmę się takimi rzeczami jak 99 butelek piwa i Project Euler problemy ...

Jestem pewien, że możesz znaleźć wiele rzeczy, które Cię interesują, które dotyczą FP; oferuje wszystko, od ulepszeń do OOP, które pomagają ci streścić sprawy nieco bardziej zwięźle aż do zmiany sposobu, w jaki myślałeś o tym wcześniej, w kształt, którego nie rozpoznajesz i prawdopodobnie nie miałeś nawet modelu mentalnego do wyrażenia przed.

Ale ... W moim modelu jest dziura, droga PSE dziura ...

I dlatego ważne jest, aby, zwłaszcza na początku, ale tak naprawdę przez cały czas nauki (i czy nie zawsze jest to prawdą, gdy się czegoś uczysz?) Przynajmniej trochę czasu między problemami czytać rzeczy niezwiązane, ale wciąż FP i czas na odczytanie kodu źródłowego napisanego przez ekspertów, najlepiej rozwiązanie tych samych lub podobnych problemów; a także ich wyjaśnienia ...

I cały czas musisz wysilać swój mózg, aby zrozumieć to wszystko, nie z twojej starej perspektywy, ale z samego FP ... W pewnym momencie dla mnie kliknęło i ... rzecz, którą najlepiej mogę to powiązać staje się mniej lub bardziej biegły w języku niderlandzkim; w pewnym momencie udało mi się w wystarczającym stopniu postawić na sposób myślenia (zrobiłem to przez zanurzenie, co w zasadzie to tutaj opisałem; zanurzenie się w FP, zamiast próbować nauczyć się tego wyłącznie poprzez „książkowe uczenie się”…

I ostatecznie to zrobiłem; Udało mi się wszystko zinternalizować i przekręcić mózg, aż zaczęłam wyskakiwać z FP / LINQ, nawet bez konieczności tłumaczenia go z powrotem na OOP. (Tak, zrobiłem to; musiałem mieć coś do powieszenia na spódnicy. Kapelusz. Cokolwiek.)

Końcowe przemyślenia...

Mój, wygląda na to, że tracisz zdolność myślenia o swoim sygnaturze sprytnie
tytuły sekcji. Jaka szkoda.

Telekonferencja wciąż szybko się zbliża. Wydaje się teraz znacznie większy.
> tak, tak, cóż ... zwięzłe i wszystko inne. Widzę, że udało ci się zgubić tę grotę.
 bliskie połączenie, to ... no cóż, jestem ter ... Och NIE, WSTĘP!
AAAAAAAHHHHHH !! [ucieka krzyczac, jeszcze raz]

Telekonferencja wciąż szybko się zbliża.
W pewien sposób przypomina Sir Lancyjohna Cleezewiza.
To już prawie koniec.
> hej, pospiesz się! Mam eksperyment z tobą! (i po-ta-to)

Oczywiście w Internecie można znaleźć mnóstwo informacji o FP. Najważniejsze jest, aby zrozumieć podstawowe pojęcia, a następnie nauczyć się je stosować. Na przykład dowiedz się o niezmienności i dlaczego jest to ważne / przydatne dla FP. Gorąco polecam nauczenie się trochę teorii, aby zgodzić się ze wszystkim, na przykład, jak czysty FP może być znacznie bardziej podatny na formalny dowód. To była siła napędowa przodka F #, ML. YMMV oczywiście możesz być osobą znudzoną łzami, w takim przypadku wiele przykładów, wiele prób i błędów, aby dowiedzieć się dokładnie, dlaczego zastosowane techniki są takie, jakie są, pomogą ci mieć to „Aha!” moment żarówki.

Więc na razie to zostawię. Mam nadzieję, że to komuś się przyda. Chciałem dowiedzieć się czegoś więcej na temat konkretnych rzeczy, ale na razie nie mam czasu. Mam nadzieję, że znajdę trochę czasu, aby szybko do niego wrócić, chociaż dla mnie to długi tydzień, więc prawdopodobnie będzie to przynajmniej weekend.

<3 „Przedstawiamy GRUEBOL, chwilową lukę; tylko do czasu ukończenia SnozzML. Powinno to być wkrótce; tym razem ogromna komisja pomaga mi”. --Grace Hopperwit Egghead, Famous Last Words , XX97 GUE <3

shelleybutterfly
źródło
co to jest „drogi SO”?
komar
był drogi przepełnienie stosu; powinien pasować do rytmu piosenki „There A Hole in the Bucket” xD
shelleybutterfly
gdy jest wysyłany poza SO, wydaje się, że to utrudnia zrozumienie twoich punktów - rozważ edycję, aby to uwzględnić
komentuj
derp! tak, rzeczywiście zrobiłem. tyvm. :)
shelleybutterfly
jeśli ktoś ma sugestie, jak poprawić moją odpowiedź, byłbym wdzięczny .. czy to był zły humor? czy zła rada? w rzeczywistości opiera się na moim doświadczeniu, więc z przyjemnością go zmieniam, jeśli mogę uczynić go bardziej użytecznym. dzięki;)
shelleybutterfly