Do czego służy Haskell w prawdziwym świecie? [Zamknięte]


475

W Haskell jest dużo szumu, jednak trudno jest uzyskać informacje na temat tego, jak jest używany w rzeczywistych aplikacjach. Jakie są najpopularniejsze projekty / zastosowania Haskell i dlaczego wyróżnia się w rozwiązywaniu tych problemów?


56
Nie, nie zrobię tego, ponieważ jest to jednoznaczna odpowiedź. Nie ma miejsca na opinie i takie tam. Chcę tylko wiedzieć, dla jakiego języka został stworzony.
Sergio Tapia,


12
@ Papuccino1, czekaj, czy chcesz wiedzieć, do czego jest przydatny lub do czego został stworzony ? To pierwsze pytanie zadaje pytanie i jest tam dużo miejsca na opinie ...
bdonlan,

3
@ Papuccino1 - Jakie korzyści przynoszą dodatkowe słowa w tytule pytania? Myślę też, że źle rozumiesz użycie terminu „funkcjonalny” w tym kontekście, ale trudno powiedzieć.
Chris Lutz

2
Według własnej strony internetowej wiele firm używa go do różnych celów ... haskell.org/haskellwiki/Haskell_in_industry
Julian

Odpowiedzi:


309

Jakie są typowe zastosowania tego języka?

Szybkie tworzenie aplikacji.

Jeśli chcesz wiedzieć „dlaczego Haskell?”, Musisz wziąć pod uwagę zalety funkcjonalnych języków programowania (wzięte z https://c2.com/cgi/wiki?AdvantagesOfFunctionalProgramming ):

  • Programy funkcjonalne są zwykle bardziej zwięzłe niż ich odpowiedniki w języku imperatywnym. Często prowadzi to do zwiększenia wydajności programisty

  • FP zachęca do szybkiego prototypowania. Jako taki, myślę, że to najlepszy paradygmat projektowania oprogramowania dla ExtremeProgrammers ... ale co ja wiem?

  • FP ma budowę modułową pod względem funkcjonalności, a ObjectOrientedProgramming ma budowę modułową pod względem różnych komponentów.

  • Zdolność do posiadania ciasta i zjedzenia go. Wyobraź sobie, że masz skomplikowany system przetwarzania komunikatów OO - każdy komponent może wprowadzać zmiany stanu w zależności od komunikatu, a następnie przekazywać go do niektórych obiektów, do których ma łącza. Czy nie byłoby to zbyt fajne, aby móc łatwo cofnąć każdą zmianę, jeśli jakiś obiekt głęboko w hierarchii połączeń uzna, że ​​komunikat jest wadliwy? Co powiesz na historię różnych stanów?

  • Wiele zadań porządkowych wykonanych dla Ciebie: dekonstruowanie struktur danych (PatternMatching), przechowywanie zmiennych powiązań (LexicalScope z zamknięciami), silne pisanie (TypeInference), GarbageCollection, przydzielanie pamięci, czy używać pudełku (wskaźnik do wartości) czy rozpakowaniu (wartość bezpośrednio ) reprezentacja ...

  • Bezpieczny wielowątkowość! Niezmienne struktury danych nie podlegają warunkom wyścigu danych, a zatem nie muszą być chronione przez blokady. Jeśli zawsze alokujesz nowe obiekty, a nie niszcząc destrukcyjnie istniejące, blokowanie można ukryć w systemie alokacji i GarbageCollection.

Poza tym Haskell ma swoje zalety, takie jak:

  • Przejrzysta, intuicyjna składnia inspirowana notacją matematyczną.
  • Wyjaśnij listę, aby utworzyć listę na podstawie istniejących list.
  • Wyrażenia lambda: twórz funkcje bez nadawania im wyraźnych nazw. Dlatego łatwiej jest obsługiwać duże formuły.
  • Haskell jest całkowicie transparentny . Każdy kod korzystający z We / Wy musi być oznaczony jako taki. W ten sposób zachęca Cię do oddzielenia kodu z efektami ubocznymi (np. Umieszczenie tekstu na ekranie) od kodu bez (obliczenia).
  • Leniwa ocena to naprawdę fajna funkcja:
    • Nawet jeśli coś zwykle powoduje błąd, nadal będzie działać, dopóki nie użyjesz wyniku. Na przykład możesz umieścić 1 / 0jako pierwszy element listy i nadal będzie działać, jeśli użyjesz tylko drugiego elementu.
    • Łatwiej jest pisać programy wyszukiwania, takie jak ten solver sudoku, ponieważ nie ładuje wszystkich kombinacji naraz - po prostu generuje je w miarę postępów. Możesz to zrobić w innych językach, ale domyślnie robi to tylko Haskell .

Możesz sprawdzić następujące linki:


20
Często przychodzi mi do głowy następująca myśl: w czystym języku funkcja zawsze zwraca ten sam wynik po przekazaniu tych samych parametrów. To jest gwarancja. Natomiast języki imperatywne budują wszystko na „wyciągach”. Oświadczenie nie jest objęte żadną gwarancją (z wyjątkiem tego, że jego wykonanie pochłania czas i wytwarza ciepło). Tak więc fundament jest już chwiejny i wszystko na nim bujne pozostanie chwiejne. Dla mnie był to jeden z powodów, dla których warto nauczyć się haskell.
Martin Drautzburg

8
Minęło 6 lat od momentu zadawania tego pytania i debiutu języka programowania Go. Pomimo słabszego systemu typów i ogólnie „obiektywnie gorszej jakości” (według fanów funkcjonalnych / ML), udało mu się dostarczyć więcej (i ważniejsze) oprogramowanie w ciągu tych 6 lat niż Haskell w ciągu 26 lat. Mam na myśli to jako studium przypadku; są oczywiście rzeczy, które powstrzymują funkcjonalne języki i nie można ich wszystkich przypisać szumowi.
weberc2

3
Zapomniałeś sensu - kodowanie w haskell to absolutna frajda;) Świetnie się bawiłem, próbując rozwiązać problemy z haskell.
J Atkin

8
@MartinDrautzburg Oczywiście oświadczenia pochodzą z gwarancjami. Jaki użyteczny język miałby oświadczenia bez gwarancji? Na przykład w C x = 5;gwarantuje, że po wykonaniu xzawiera wartość 5.
user253751,

5
@ E4z9 Tak, ale w C ++ gwarantuje, że operator =zostanie wywołany. Gwarantuje to, co się stanie, jeśli nie zdefiniujesz użytkownikaoperator =
user253751,

234

Myślę, że osobom w tym poście brakuje najważniejszego punktu dla każdego, kto nigdy nie używał funkcjonalnego języka programowania: rozwijania umysłu. Jeśli dopiero zaczynasz programowanie funkcjonalne, Haskell sprawi, że będziesz myślał w sposób, jakiego nigdy wcześniej nie myślałeś. W rezultacie poprawisz swoje programowanie w innych obszarach i innych językach. Ile? Trudne do oszacowania.


2
Używam iPhone'a, Maca. Gdzie stosuje się Haskell? Mam na myśli, że aplikacje, z których korzystałem, są napisane w Objective-C lub Swift + coś dla bazy danych i serwerów. Swift może być również funkcjonalny. Więc znowu jestem zdezorientowany co do tego, gdzie jest używany
Honey

2
Facebook wykrywa
Alex

25
Ta odpowiedź, napisana innym tonem, mówi, że Haskell jest świetnym ćwiczeniem dla programisty, którego IMO nie jest świetnym językiem ogólnego przeznaczenia
Passer By

5
W Keera Studios piszemy gry i aplikacje na iOS i Androida za pomocą Haskell.
Ivan Perez

1
Całkowicie się z tym zgadzam. Przez dziesięciolecia napisałem dużo kodu w imperatywnych językach. Eksploruję Haskell od kilku miesięcy i to otworzyło mi umysł na rzeczy, o których wcześniej nie myślałem.
Adahus

87

Jest jedna dobra odpowiedź na to, do czego służy język ogólnego przeznaczenia, taki jak Haskell: pisanie programów w ogóle.

Do tego, do czego jest wykorzystywany w praktyce, mam trzy podejścia do ustalenia, że:

Wskazuje, że jest dobry dla grafiki, sieci, programowania systemów, struktur danych, baz danych, programowania, przetwarzania tekstu ...

I wreszcie moja opinia na temat tego, na czym jest naprawdę silna:

Mam nadzieję, że dzięki temu zrozumiesz, jak szerokie jest twoje pytanie, jeśli na nie można udzielić konkretnej odpowiedzi.


15
Chmura znaczników jest zepsuta
Elliot Cameron

czy chmura tagów została wygenerowana przy użyciu wordcloud ?
Janus Troelsen

29

Jednym z przykładów działania Haskell jest xmonad , „funkcjonalny menedżer okien w mniej niż 1200 liniach kodu”.


18

Z Wiki Haskell :

Haskell ma różnorodne zastosowania komercyjne, od przemysłu lotniczego i obronnego, przez finanse, po start-upy internetowe, firmy projektujące sprzęt i producentów kosiarek. Ta strona zbiera zasoby dotyczące przemysłowego wykorzystania Haskell.

Według Wikipedii, Haskell język powstał z potrzeby konsolidacji istniejących języków funkcjonalnych we wspólny język, który można by wykorzystać w przyszłych badaniach nad projektowaniem języka funkcjonalnego.

Na podstawie dostępnych informacji widać, że przerósł swój pierwotny cel i jest wykorzystywany do czegoś więcej niż badań. Obecnie jest uważany za funkcjonalny język programowania ogólnego przeznaczenia.

Jeśli nadal zadajesz sobie pytanie: „Dlaczego powinienem go używać?”, Przeczytaj artykuł Dlaczego go używać? sekcja Haskell Wiki Wprowadzenie.


13

Haskell jest językiem programowania ogólnego przeznaczenia. Można go używać do wszystkiego, czego używasz w innym języku. Nie ogranicza Cię nic oprócz własnej wyobraźni. Co do tego, do czego jest odpowiedni? Cóż, prawie wszystko. Istnieje kilka zadań, w których język funkcjonalny nie przoduje.

I tak, jestem Rayne z Dreamincode. :)

Chciałbym również wspomnieć, że jeśli nie przeczytałeś strony Wikipedii, programowanie funkcjonalne jest paradygmatem, podobnie jak programowanie obiektowe. Na wypadek, gdybyś nie wiedział. Haskell działa również w tym sensie, że działa; w tym działa całkiem dobrze.

To, że język nie jest językiem obiektowym, nie oznacza, że ​​jest on ograniczony przez cokolwiek. Haskell jest językiem programowania ogólnego i jest tak samo ogólnego przeznaczenia jak Java.


9

Mam fajny, facebook stworzył zautomatyzowane narzędzie do przepisywania kodu PHP. Analizują źródło w abstrakcyjne drzewo składniowe, dokonują transformacji:

if ($f == false) -> if (false == $f)

Nie wiem dlaczego, ale wydaje się, że to ich szczególny styl, a potem całkiem go wydrukowali.

https://github.com/facebook/lex-pass

Używamy haskell do tworzenia języków specyficznych dla małych domen. Ogromne ilości przetwarzania danych. Tworzenie stron internetowych. Pająki internetowe. Testowanie aplikacji. Pisanie skryptów administracyjnych systemu. Skrypty zaplecza, które komunikują się z innymi podmiotami. Skrypty monitorujące (mamy DSL, który ładnie współpracuje z muninem, znacznie ułatwia pisanie poprawnego kodu monitora dla twoich aplikacji).

Właściwie wszelkiego rodzaju rzeczy. Jest to zwykły język ogólnego przeznaczenia z kilkoma bardzo zaawansowanymi i przydatnymi funkcjami, jeśli jesteś nieco matematycznie skłonny.


6
Re: styl FB, umieszczenie fałszu przed == oznacza, że ​​jeśli zapomnisz i napiszesz tylko jeden = wtedy wynikowe zachowanie będzie bardziej ewidentnie błędne zamiast po cichu wykonać niezamierzoną operację przypisania i kontynuować normalnie
Magnus

To sprytne, twoja siła zmusza szczególnie ten błąd do znania czasu kompilacji.
Edgar Klerks,

@EdgarKlerks, PHP nie ma czasu kompilacji. Wymusza to zgłoszenie wyjątku tam, gdzie był błąd, zamiast prowadzić do dziwnych zachowań lub błędów w odległym kodzie.
dfeuer

Chociaż widzę korzyści płynące z pisania falsepo lewej stronie, nie widzę sensu używania narzędzia do robienia tego automatycznie: jeśli masz już ==operatora, to wiesz, że nie masz błędu, którego ta część lex-pass jest przeznaczony do łapania, a jeśli masz =zamiast niego, nie ma pewnego sposobu, aby powiedzieć, czy tak jest celowo.
Jeremy List

1
@JeremyList Być może są bardzo rygorystyczni w stylu kodowania. Widzę, że starannie sformatowany kod zachęca do napisania bardziej starannie sformatowanego kodu. Po prostu dzikie domysły.
Edgar Klerks,

6

Od Haskell :

Haskell jest znormalizowanym, ogólnie funkcjonalnym, czysto funkcjonalnym językiem programowania , o niesolidnej semantyce i silnym typowaniu statycznym. Jego nazwa pochodzi od logika Haskella Curry'ego.

Zasadniczo Haskell może być używany do tworzenia praktycznie wszystkiego, co normalnie tworzysz przy użyciu innych języków ogólnego przeznaczenia (np. C #, Java, C, C ++ itp.).


5

Na przykład do tworzenia interaktywnych aplikacji internetowych HTML5 w czasie rzeczywistym. Zobacz Elm , którego kompilator jest zaimplementowany w Haskell, a jego składnia często pożycza od Haskella.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.