Jaki jest najbardziej kompatybilny, powszechnie używany język produkcyjny do eksportowania wiedzy i umiejętności zdobytych w firmie Haskell?

14

Lubię Haskell, prosty i prosty. Chociaż Haskell jest używany w oprogramowaniu produkcyjnym, nie jest on szczególnie szeroko rozpowszechniony z tego, co widziałem. Jaki jest najbardziej podobny i wciąż powszechnie używany język w odniesieniu do projektów produkcyjnych, abym mógł mieć szansę na użycie śnieżki w branży?

Czy ten sam język z pierwszej części jest dostępny na dużej liczbie platform? Jeśli nie, jaka jest najlepsza alternatywa dla szerokiej platformy? Chciałbym, aby jeden język umieścił na mojej liście rzeczy do zrobienia zamiast ogromnego roju lub rodziny. Twardy dowód byłby plusem.

Inżynier świata
źródło

Odpowiedzi:

21

Haskell jest najbardziej związany z rodziną języków ML. Dotyczy to oczywiście OCaml , ale także F # na platformie .NET. Języki te dzielą z Haskell podstawę systemu typów i sposób wykorzystania danych - algebraiczne typy danych, dopasowanie wzorców, wnioskowanie typów itp. Oczywiście mogą się znacznie różnić od Haskell w innych punktach - większość ML jest surowa i nieczysta , a na początku popularność Haskell jako narzędzia do badań nad systemami typów i projektowania języków oznacza, że ​​większość języków w stylu ML ma zwykle słabsze (ale potencjalnie łatwiejsze do zrozumienia) systemy typów. Prawdopodobnie bezpiecznie jest powiedzieć, że możesz przegapićpewne rzeczy na temat Haskell, szczególnie na początku, większość programistów Haskell prawdopodobnie szybko poczuje się komfortowo w domu w ML, na podstawowym poziomie rzeczy do zrobienia. Jeśli chcesz języka o tej samej ogólnej strukturze co Haskell, ML jest najlepszym wyborem.

Funkcjonalna strona Scaliczerpie także mocno z tradycji ML, a także wprowadza zaawansowane funkcje systemu typowego znane z Haskell, a także bardziej standardowy system OOP zintegrowany z powyższym. Podczas gdy OO w językach w stylu ML jest zwykle traktowane jako „modelowy OO z podstawowymi narzędziami funkcjonalnymi” Scala żyje i oddycha OO w stylu Java. Jest to korzystne dla interakcji Java, jak można sobie wyobrazić, i oferuje bardziej znane środowisko pracy dla programistów OO. Jednak, pochodząc z tła Haskell, bardziej prawdopodobne jest, że zirytujesz się sposobami, w których mieszanie rzeczy w Scali sprawia, że ​​funkcjonalne idiomy są nieporadne, a większość API Java jest źle zaprojektowana i niepotrzebnie trudna w użyciu.

Wreszcie, chociaż wydaje się to dziwne, Clojure ma wiele rzeczy wspólnych z Haskellem na bardziej filozoficznym poziomie. Większość tego, co znajdziesz w podejściu Clojure do stanu i wartości vs. tożsamości, jest bardzo zbliżona duchem do tego, co Haskell formalizuje poprzez system typów. Odpowiednio, Clojure w mniejszym stopniu kładzie nacisk na interakcję Java i nie martwi się tak bardzo o przeciąganie w OOP, więc w pewnym sensie podejście Clojure do samego programowania funkcjonalnego może być najbliższe temu, co już znasz. Myślę, że mówi w tym względzie, że o ile mi wiadomo, Clojure jest jedynym językiem oprócz Haskell, który ma implementację STMto proste, skuteczne i po prostu działa. Z drugiej strony Clojure wywodzi się z tradycji Lisp, a zatem brakuje mu statycznego systemu typów i nacisku na algebraiczne typy danych i dopasowanie wzorców występujące w językach wpływających na ML. I oczywiście jest to Lisp, co samo w sobie jest negatywne dla niektórych osób (choć tak naprawdę nie wiem dlaczego).

Mówiąc za siebie, z zastrzeżeniem, że moje pierwsze doświadczenie z programowaniem funkcjonalnym było w Scheme, prawdopodobnie skłaniam się ku Clojure, z OCaml prawdopodobnie drugim wyborem.

CA McCann
źródło
1
Mówi się, że F # został zainspirowany, jeśli nie pochodzi od OCaml. Poprzednie pytanie SO, F # i OCaml , obejmuje dobrą dyskusję na temat tego związku. Jeśli jesteś po stronie .NET, F # byłby doskonałym wyborem, a Microsoft uważa teraz F # za język „pierwszej klasy” .NET. Po stronie JVM Scala ma doświadczenie w przemyśle, a Clojure wydaje się rosnąć na listach przebojów. W tej chwili nie znam żadnego najlepszego wyboru, ponieważ rynek nie ogłosił jeszcze wyraźnego zwycięzcy w tej obiektowo-funkcjonalnej przestrzeni.
John Tobler,
4

Nigdy nie korzystałem z niego osobiście, ale czasami widzę, jak Scala pojawia się na blogach lub w opisach projektów, i sądzę, że Haskell potrzebował ważnych pomysłów. Scala kompiluje się do JVM i może współpracować z Javą.

Jürgen Strobel
źródło
3

Funkcjonalną alternatywą jest Erlang . Chociaż jest to język bardzo współbieżny, sekwencyjny podzbiór jest językiem czysto funkcjonalnym z wieloma właściwościami języków funkcjonalnych, na przykład zamknięciami, niezmiennymi danymi i dopasowaniem wzorców. Działa na wielu platformach, w tym Linux, różnych unixach, Windowsach i Macosxie. Teraz jest nawet implementacja JVM, erjang . Może łatwo komunikować się i współistnieć z innymi językami, w ten sposób jest często używany.

Sprawdź stronę główną .

rvirding
źródło
3

Clojure jest coraz szerzej stosowany i choć na powierzchni nie wygląda jak Haskell, jeśli spojrzysz trochę głębiej, wyraźnie inspiruje go Haskell i zachęca do bardzo podobnego stylu funkcjonalnego.

Kluczowe funkcje Clojure, które użytkownicy Haskell mogą uznać za znajome i przekonujące:

  • Język podstawowy jest czysto funkcjonalny - chociaż możliwe są skutki uboczne, są one ukryte w określonych miejscach (np. Referencje STM, funkcje IO, interoperacyjność Java)
  • Wszystkie struktury danych są niezmienne i trwałe
  • Lenistwo - osiągnięte głównie dzięki wszechobecnym leniwym sekwencjom Clojure, będzie to bardzo dobrze znane użytkownikom Haskell. Nieskończone leniwe sekwencje są w porządku.
  • Software Transactional Memory - jest głównym sposobem obsługi stanu zmiennego w Clojure. Warto obejrzeć ten wspaniały film, w którym Rich Hickey wyjaśnia podejście Clojure do tożsamości i stanu: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

Kluczowe różnice (mogą być dodatnie lub ujemne w zależności od twojej perspektywy):

  • To jest nieczyste - chociaż moja obserwacja jest taka, że ​​idiomatyczny styl Clojure polega na trzymaniu czystych funkcji tam, gdzie to możliwe.
  • Pisanie dynamiczne zamiast statyczne (chociaż wskazówki dotyczące typów statycznych można opcjonalnie stosować do optymalizacji wydajności)
  • Jest to język JVM z łatwym dostępem do całego ekosystemu biblioteki Java - to moim zdaniem największa zaleta pod względem możliwości zastosowania w świecie rzeczywistym
  • Składnia Lisp. Dzięki temu zyskujesz wszystkie zalety homoikoniczności kosztem nauki przeglądania wszystkich nawiasów :-)

Perspektywa osobista: nauczyłem się Haskella przed Clojure i kochałem Haskell za jego elegancję i matematyczną czystość. Clojure czerpie wiele inspiracji i pożycza wiele dobrych funkcji od Haskella, ale jest znacznie bardziej pragmatyczny / praktyczny. Zwłaszcza gdy liczy się ogromna wartość możliwości wykorzystania ekosystemu biblioteki Java, jest to świetny język do „robienia rzeczy”.

mikera
źródło
1

Jeśli podoba Ci się Haskell, ale musisz napisać kod dla JVM, frege może być dla ciebie interesujący. Został zaprojektowany tak, aby być jak najbliżej Haskell 2010, ale generuje kod Java.

Oczywiście samo frege nie jest niczym „powszechnie używanym językiem produkcyjnym” (został niedawno opublikowany), ale Java jest z pewnością.

Ingo
źródło