Jak mogę używać programowania funkcjonalnego w prawdziwym świecie? [Zamknięte]

103

Języki funkcjonalne są dobre, ponieważ pozwalają uniknąć błędów, eliminując stan, ale także dlatego, że można je łatwo zrównoleglać automatycznie, bez martwienia się o liczbę wątków.

Jednak jako programista Win32, czy mogę używać Haskell dla niektórych bibliotek DLL mojej aplikacji? A jeśli to zrobię, czy jest prawdziwa korzyść, która zostanie automatycznie wykorzystana dla mnie? Jeśli tak, co daje mi tę przewagę, kompilator?

Czy F # zrównoleglenie funkcji, które piszesz na wielu rdzeniach i procesorach automatycznie dla Ciebie? Czy kiedykolwiek zauważyłeś wzrost liczby wątków w menedżerze zadań?

Zasadniczo moje pytanie brzmi: jak mogę zacząć używać Haskell w praktyczny sposób i czy naprawdę zobaczę jakieś korzyści, jeśli to zrobię?

Brian R. Bondy
źródło
2
Osobiście zajrzałbym do erlang - ale to ja.
Jason Bunting
2
Aby trochę wyjaśnić, mam już doświadczenie z kilkoma różnymi językami programowania funkcjonalnego i wiem, jak one działają i jakie są między nimi różnice. Ale to pytanie jest konkretnie: jak zabrać to do użytku w prawdziwym świecie.
Brian R. Bondy,

Odpowiedzi:

41

Wygląda na to, że książka Real World Haskell jest właśnie tym, czego szukasz. Możesz go przeczytać bezpłatnie online:

http://book.realworldhaskell.org/

Apocalisp
źródło
Czekam na wydrukowanie. Wygląda na to, że będzie to jedna z lepszych książek. Założę się, że będzie lepiej obsługiwał osoby zainteresowane Haskellem niż Practical Ocaml dla Ocaml
Friedrich
25

F # nie zawiera żadnego magicznego pyłu pixie, który przekazywałby funkcje do różnych procesorów lub maszyn. F # / Haskell i inne funkcjonalne języki programowania ułatwiają pisanie funkcji, które mogą być przetwarzane niezależnie od wątku lub procesora, na którym zostały utworzone.

Nie czuję się dobrze umieszczając tutaj link do podcastu, w którym uczestniczę, wydaje się trochę nierealny, ale w odcinku Kodeks pasterski, w którym rozmawialiśmy z Mattem Podwysockim, zadaliśmy to samo pytanie, a on udzielił kilku ciekawych odpowiedzi. W tym odcinku jest również wiele dobrych linków dotyczących programowania funkcjonalnego. Znalazłem jeden link zatytułowany „ Dlaczego programowanie funkcjonalne ma znaczenie ”, który może dostarczyć Ci odpowiedzi.

ScottKoon
źródło
21
Następnie napiszę dla Ciebie: herdingcode.com/?p=45 :)
Brian R. Bondy
14

To może być również interesujące: „ Programowanie funkcjonalne w świecie rzeczywistym

Przykłady są w językach F # i C #, ale teoria jest dość ogólna. Z tego, co przeczytałem (przed wydaniem), jest to zdecydowanie interesujące, ale jak dotąd myślę, że sprawia, że ​​chcę coraz bardziej trzymać się C #, używając bibliotek takich jak Parallel Extensions.

Marc Gravell
źródło
Czy nadal czujesz, że „chcesz coraz bardziej trzymać się języka C #”? F # oferuje kilka interesujących funkcji. Największy wzrost, jaki uzyskałem, to mniej pisania (co oznacza mniejsze tarcie w procesie wyrażania rozwiązań w kodzie).
Daniel
1
@Daniel w pewnym sensie, a nawet bardziej; p Narzędzia, nad którymi pracuję, mogą być jednak nietypowe.
Marc Gravell
8

Nie wspomniałeś, ale zakładam, że używasz C ++. Jednym z potencjalnie łatwych sposobów uzyskania funkcjonalności jest przejście z C ++ / CLI do F #. C ++ zawiera „Magic pixie dust” (zwany IJW: It Just Works), który umożliwia wywoływanie i wychodzenie z zarządzanego kodu. Dzięki temu wywoływanie kodu F # jest prawie tak proste, jak w języku C #.

Użyłem tego w jednym programie (FreeSWITCH), który jest w całości napisany w C / C ++. Z pojedynczym zarządzanym C ++ / CLI (użyj przełącznika / clr), magicznie przechodzi do kodu zarządzanego, a stamtąd mogę załadować moje wtyczki F # i je wykonać. Aby jeszcze bardziej ułatwić wdrażanie, F # może statycznie łączyć wszystkie swoje zależności, więc nie trzeba wdrażać plików środowiska uruchomieniowego F #. Inną rzeczą, która sprawia, że ​​kod CLR jest atrakcyjny, jest to, że można przekazać kod zarządzany (delegatów) do kodu C, a środowisko uruchomieniowe automatycznie robi to za Ciebie.

Jeśli zdecydujesz się pójść drogą Haskella, funkcja, której będziesz szukać, to FFI: Foreign Function Interface. Jednak nie sądzę, że da ci to ten sam poziom integracji co C ++ / CLI z F #.

MichaelGG
źródło
6

Obecnie sam uczę się języka Haskell, kiedy zaczynasz się go uczyć, nie wydaje się to zbyt intrygujące, ponieważ nauka NIC nie przypomina nauki języka takiego jak C #, to zupełnie nowy świat, ale zauważyłem, że potrafię pisać bardzo bardzo złożone wyrażeń w zaledwie kilku wierszach kodu, kiedy spojrzałem na kod, był znacznie bardziej zwięzły, był mały i ciasny. Absolutnie to uwielbiam! Rzeczywiście, możesz pisać programy w świecie rzeczywistym, które będą mniejsze, łatwiejsze w utrzymaniu i znacznie bardziej złożone niż pozwala na to większość innych języków. Głosuję na Ciebie, abyś się tego nauczył !!

Powodzenia.

Rayne
źródło
4

Skoro wspominasz o Win32 i bibliotekach DLL, zakładam, że pracujesz z niezarządzanym kodem. W takim przypadku GHC będzie działać bardzo dobrze dla Ciebie. Pod koniec zeszłego roku napisałem serwer DDE pod Windows przy użyciu FFI do rozmowy z bibliotekami MS DDE i, o dziwo, było to niezwykle przyjemne doświadczenie (zwłaszcza biorąc pod uwagę, że jestem facetem z Uniksa). FFI firmy Haskell jest potężne (nawet obsługuje np. Wywołania zwrotne funkcji Haskella z C lub innych bibliotek), a sprawdzanie typu przez Haskella podczas pisania kodu na poziomie C jest jak spełnienie marzeń.

Ta ostatnia kwestia to jedna z głównych zalet Haskella: system czcionek jest niesamowity. To powiedziawszy, jest jak każde potężne narzędzie; potrzebuje czasu i wysiłku, aby dobrze go wykorzystać.

Więc tak, można zacząć pisać małe fragmenty kodu w Haskell, które prowadzą do reszty kodu (chociaż może być łatwiejsze rozpoczęcie od małych programów Haskell, które prowadzą do innego kodu) i warto je wydać sporo czasu na poznanie tego i wykorzystanie go, gdzie tylko możesz. Możesz skończyć tak jak ja, planując dość duży projekt ściśle zintegrowany z kodem Windows (w moim przypadku wyrafinowanym dodatkiem Excela) w Haskell.

cjs
źródło