Haskell AND Lisp vs. Haskell OR Lisp [zamknięte]

40

Obecnie koduję w C, C ++ i Python. Chcę wybrać funkcjonalny język programowania, a teraz pochylam się w kierunku Haskell. NIE chcę tutaj rozpoczynać wojny „Haskell vs Lisp”; Chcę wiedzieć, co następuje: jeśli nauczę się Haskell przede wszystkim w zakresie programowania funkcjonalnego, jakie korzyści, jeśli w ogóle, uzyskam dzięki późniejszej nauce Lisp?

Zeke
źródło
1
I F # i Clojure.
cnd

Odpowiedzi:

58

Proponuję nauczyć się obu, najpierw Haskell, potem Common Lisp. Moje doświadczenie z Haskellem polegało na tym, że pisanie statyczne wydawało się początkowo ograniczającą irytacją, ale kiedy się do tego przyzwyczaiłem, zauważyłem, że za większością błędów mojego typu kryły się błędy logiczne. Gdy dojdziesz do tego punktu i następnego kamienia milowego, którym jest nauczenie się myślenia na temat typów i definiowania własnych typów jako sposobu wyrażenia swojego rozwiązania, będziesz gotowy na Common Lisp.

Dzięki Common Lisp możesz dodawać monady, curry i wszystko, co lubisz od Haskell, ale zyskujesz także wiele dziedziczenia, jak wspomniano Frank Shearar, a także funkcje ogólne z wieloma wysyłkami i zaawansowany system obsługi wyjątków.

Dlaczego więc nie po prostu najpierw nauczyć się Common Lisp? Wywodzę się z tła proceduralnego i OOP. Z mojego doświadczenia wynika, że ​​tak naprawdę nie rozumiałem programowania funkcjonalnego, dopóki nie musiałem go używać wyłącznie. Gdy programowanie funkcjonalne jest wygodne, możesz dodać resztę narzędzi udostępnianych przez Common Lisp i używać dowolnego narzędzia, które jest najlepsze w danym zadaniu.

Larry Coleman
źródło
6
Myślę, że go przybiłeś - tym, co sprawia, że ​​Haskell i Smalltalk są tak przydatne do nauki, jest ich czystość.
Frank Shearar
4
Zgadzam się z czystością, która znacznie ułatwia naukę języka. Nie mogłem zrozumieć samego języka funkcjonalnego za pomocą LISP, ponieważ wszystko jest możliwe w tym języku i mam zbyt wiele imperatywnych doświadczeń, OO. Ale w Haskell nie ma takich koncepcji, które zakłócałyby naukę.
Eonil
1
To zabawne, miałem odwrotne doświadczenie. Podniosłem główne punkty programowania funkcjonalnego za pośrednictwem Scheme, mojego pierwszego języka. Od czasu do czasu włamuję się do Haskell i nieuchronnie stwierdzam, że muszę nauczyć się ponad 90% rzeczy, które znałem za każdym razem, gdy opuszczam Haskell. To powiedziawszy, Haskell jest niezwykle bogatym językiem, z ogromną ilością do nauczenia (bardzo siłą). Typy Typy Typy Typy! Śledź typy!
Josh Infiesto
31

I proszę.

Haskell uczy cię najczystszego FP, o ile mi wiadomo, tak jak Smalltalk uczy najczystszego OO. (Wspominam o tym, aby nie sugerować, że OO i FP nie mogą się ożenić, ale ponieważ oba te języki są językami „klejnotowymi” - podstawową ideą doprowadzoną do skrajności.)

Lisp jest naprawdę rodziną języków, więc porozmawiam o Common Lisp, ponieważ jest to konkretny członek rodziny, której używam.

Lisp nadal będzie miał wiele do nauczenia:

  • Jest to multiparadygmat, więc jak wskazuje dsimcha, pokaże ci, jak zintegrować FP z innymi paradygmatami.
  • Lisp nauczy Cię, że „kod to dane, dane to kod”, na przykład za pomocą makr.
  • CLOS jest bardzo interesującą marką OO, z wieloma działającymi działaniami i ogólnymi funkcjami.
Frank Shearar
źródło
11

Nauka Lisp później pozwoli ci dostosować Emacsa, który jest prawdopodobnie najbardziej zaawansowanym dostępnym edytorem tekstu. Nie możesz tego zrobić w Haskell.


źródło
14
[Wyostrza nawiasy]
Inaimathi
6
Może ktoś może napisać do tego edytor tekstu. Słyszałem, że system operacyjny Emacs nie jest dostarczany z jednym. (
Żartuję
14
W rzeczywistości istnieje klon Emacsa o nazwie Yi, który używa Haskell w dokładnie taki sam sposób, jak Emacs używa Lisp. W rzeczywistości, w porównaniu do Emacsa (GNU), Yi jest jeszcze czystszy, ponieważ jego jądro jest również napisane w Haskell, podczas gdy jądra Emacsa zwykle nie są pisane w Lisp. Jądro GNU Emacsa jest napisane w C, JEmacs jest napisane na przykład w Javie.
Jörg W Mittag
2
@ Jörg, jeśli jest to częściowa ponowna implementacja zamiast pełnego klonu GNU Emacs lub XEmacs, to nie jest to samo. Podobne do porównywania Worda z Wordpadem lub Notatnikiem.
1
@ Thorbjørn Ravn Andersen: Tak, ale nie aż tak źle. :)
greyfade
11

Haskell i Lisp to dwie zupełnie różne bestie.

Haskell jest rodzajem „czysto funkcjonalnego programowania w wieży z kości słoniowej”

Lisp jest swego rodzaju „kod-dane-dane / dane-kod-/ twórz własne konstrukcje językowe”. Możesz manipulować kodem w dowolny sposób, jaki możesz sobie wyobrazić.

Są bardzo różne. Oba dzielą aspekt „programowania funkcjonalnego”, ale to naprawdę niewielki wspólny punkt w porównaniu do ich różnic. Po prostu wypróbuj je, a zobaczysz, jak różne są!

Dagnele
źródło
+1: Dobra uwaga. Znam trochę Haskell i trochę Lisp. Chociaż nie jestem ekspertem w żadnym z nich, myślę, że masz rację, że są bardzo różni. W Haskell nie masz pomysłu używania danych jako kodu. W Lisp nie masz dopasowania wzorca (AFAIK). Prawdopodobnie lista różnic (!) Jest dłuższa.
Giorgio
7

Główną korzyścią, jaką widzę dzięki nauce Lisp, jest nauczenie się, jak zintegrować FP z językiem wieloaradygenowym zorientowanym na rzeczywistość, zamiast uczyć się go tylko w kontekście języka akademickiego, który podkreśla czystość.

dsimcha
źródło
5
Chyba chcesz wojny „Haskell vs Lisp”!
Don Roby
3
Haskell jest językiem akademickim, który podkreśla czystość ... i wiele osób używa go w prawdziwym świecie. Smalltalk też jest w tym obozie.
Frank Shearar,
Wiele osób korzysta z Haskell w prawdziwym świecie?
Jon Harrop,
1
@Jon Harrop: Cóż, używam Haskell w prawdziwym świecie (i działa naprawdę dobrze w niektórych aplikacjach), może jestem jednym z niewielu (?)
Giorgio
5

Pochodzę także ze środowisk C / C ++ / Python i kilka razy wypróbowałem FP w ciągu ostatnich kilku lat. Początkowo spojrzałem na Haskella i nie byłem w stanie zrobić z niego głowy ani ogona, potem wypróbowałem Ocaml, ale nie poszedłem dalej. W końcu zacząłem słyszeć dobre rzeczy o Scali, wypróbowałem je i stwierdziłem, że bardzo mi to odpowiadało (w przeszłości również robiłem trochę Java), do tego stopnia, że ​​po roku spędziłem trochę czasu w Scali (i wysłałem 161 Projekt Euler ma z tym problemy), wydaje się, że Haskell ma o wiele więcej sensu. Właśnie zamówiłem kilka książek o Haskell i chcę spróbować jeszcze raz, chociaż jest to w dużej mierze motywowane istnieniem Scalaza.

Uznałem więc, że używanie języka opartego na wielu paradygmatach (tj. Scala, ale Lisp prawdopodobnie również pasuje do tego rachunku) to dobry sposób na FP. Ale jeśli lubisz nurkować w Haskell (nie byłem), idź na całość.

czas
źródło
Ciekawe, że posunąłeś się dalej ze Scalą niż OCaml. Dlaczego?
Jon Harrop,
@Jon: Dobre pytanie; Ciężko powiedzieć. Może po prostu nie byłam wtedy gotowa „wejść w” funkcjonalność. Może akurat znalazłem samouczek Scali na odpowiednim poziomie. Może rodowód Scali C / C ++ / Java po prostu sprawił, że stał się nieco mniej obcy. Biorąc pod uwagę, że w dzisiejszych czasach jakikolwiek racjonalny zakład byłby oparty na F # zamiast Scali, prawdopodobnie wrócę do domeny OCaml w pewnym momencie, chociaż skoro zajmuję się tymi sprawami tylko dla czystej radości z przejścia do innego sposobu myślenia programistycznego niż mój C ++ Dayjob, mam przewrotną skłonność do ponownej próby Haskella.
dzisiaj
Płynne podejście do ruchu :)
Eonil
2

Początkowo pochodziłem z języka C / C ++ / Ruby i korzystałem z koncepcji FP w Ruby, kiedy tylko mogłem. Stan trochę zranił mój mózg. Jeden z moich kumpli zadzwonił do mnie pewnego dnia i poprosił mnie, abym napisał coś w Haskell (moja pierwsza - i mam nadzieję, że nie ostatnia - praca w Haskell!). Szybko nauczyłem się języka i rzuciłem razem coś, co zadziałało. To nie było piękne ani nic, ale działało.

Zrobiłem miesięczną przerwę od Haskell, ponieważ nie miałem z czego korzystać. Ale kiedy zdecydowałem, że muszę napisać własne oprogramowanie blogowe, skorzystałem z Haskell ( https://symer.io ). Haskell jest naprawdę fajny, ponieważ możesz podzielić problem na części i zaimplementować te części inaczej w zależności od danych wejściowych. Haskell bardzo dobrze radzi sobie również z awariami dzięki inteligentnemu zestawianiu wartości. Jest tak wiele narzędzi do pracy z tymi skrzynkami, że po prostu zapominasz, że istnieją.

Moje doświadczenia z seplenieniem (Schemat) były całkowicie negatywne. Językowi brakowało nie tylko tych inteligentnych, prostych narzędzi, ale także niebezpiecznie luźnych jak Ruby czy JavaScript. To było okropne doświadczenie i nie oferuje nic nowego poza Ruby lub Python.

C ++ nie może trzymać świeczki przed Haskellem poza zarządzaniem pamięcią. Haskell jest równie szybki (jeśli nie szybszy), znacznie bardziej zwięzły i znacznie bezpieczniejszy. Ale bezpieczeństwo Haskella nigdy nie przeszkadza.

TL; TR Haskell to powiew świeżego powietrza, a Lisp to nieco bardziej funkcjonalny Ruby.

Nate Symer
źródło