Rozpoczęcie pracy z Haskell

755

Przez kilka dni próbowałem owinąć głowę wokół paradygmatu programowania funkcjonalnego w Haskell. Zrobiłem to, czytając tutoriale i oglądając screencasty, ale tak naprawdę nic się nie trzyma. Teraz, ucząc się różnych języków imperatywnych / OO (takich jak C, Java, PHP), ćwiczenia były dla mnie dobrą drogą. Ale ponieważ tak naprawdę nie wiem, do czego jest zdolny Haskell, a ponieważ istnieje wiele nowych koncepcji do wykorzystania, nie wiedziałem od czego zacząć.

Jak się nauczyłeś Haskell? Co sprawiło, że naprawdę „przełamałeś lody”? Jakieś dobre pomysły na rozpoczęcie ćwiczeń?

50685
źródło
14
tryhaskell.org
Kirk Broadhurst

Odpowiedzi:

2476

Zamierzam zamówić ten przewodnik według poziomu umiejętności, który posiadasz w Haskell, od absolutnego początkującego do eksperta. Pamiętaj, że proces ten potrwa wiele miesięcy (lat?), Więc jest raczej długi.

Absolutny początkujący

Po pierwsze, Haskell jest zdolny do wszystkiego, z wystarczającymi umiejętnościami. Jest bardzo szybki (według mojego doświadczenia tylko C i C ++) i może być używany do wszystkiego, od symulacji po serwery, guis i aplikacje internetowe.

Jednak są pewne problemy, które łatwiej jest napisać dla początkującego w Haskell niż inne. Problemy matematyczne i programy do przetwarzania list są do tego dobrymi kandydatami, ponieważ do pisania wymagają jedynie podstawowej wiedzy Haskella.

Po pierwsze, niektórymi dobrymi przewodnikami do nauki podstaw Haskell są: samouczek z haskellem „Naucz się uczyć haskell” i pierwsze 6 rozdziałów z nauczeniem się haskell . Czytając je, bardzo dobrze jest rozwiązywać proste problemy z tym, co wiesz.

Kolejne dwa dobre zasoby to Programowanie Haskell od pierwszych zasad i Programowanie w Haskell . Oba zawierają ćwiczenia dla każdego rozdziału, więc masz małe proste problemy z dopasowaniem do tego, czego nauczyłeś się na kilku ostatnich stronach.

Dobrą listą problemów do wypróbowania jest strona problemów Haskell 99 . Zaczynają się one bardzo prosto i stają się coraz trudniejsze z biegiem czasu. Jest to bardzo dobra praktyka wykonywania wielu z nich, ponieważ pozwalają ćwiczyć umiejętności rekurencyjne i funkcje wyższego rzędu. Polecam pomijanie problemów wymagających losowości, ponieważ w Haskell jest to nieco trudniejsze. Sprawdź to pytanie SO, jeśli chcesz przetestować swoje rozwiązania za pomocą QuickCheck (patrz Pośredni poniżej).

Po wykonaniu kilku z nich możesz przejść do rozwiązania kilku problemów związanych z Project Euler . Są one sortowane według liczby osób, które je ukończyły, co jest dość dobrym wskaźnikiem trudności. Testują one twoją logikę i Haskella bardziej niż poprzednie problemy, ale nadal powinieneś być w stanie zrobić kilka pierwszych. Dużą zaletą Haskell przy tych problemach jest to, że liczby całkowite nie są ograniczone. Aby rozwiązać niektóre z tych problemów, przydatne będzie przeczytanie rozdziałów 7 i 8, aby nauczyć się Haskell.

Początkujący

Po tym powinieneś mieć dość dobrą kontrolę nad funkcjami rekurencji i wyższego rzędu, więc byłby to dobry czas, aby zacząć robić więcej rzeczywistych problemów. Bardzo dobrym miejscem do rozpoczęcia jest Real World Haskell (książka online, można również kupić wersję papierową). Znalazłem kilka pierwszych rozdziałów wprowadzonych zbyt szybko dla kogoś, kto nigdy wcześniej nie programował funkcjonalnie / nie używał rekurencji. Jednak dzięki praktyce, którą miałbyś podczas wykonywania poprzednich problemów, powinna być dla ciebie całkowicie zrozumiała.

Przeanalizowanie problemów zawartych w książce to świetny sposób na naukę zarządzania abstrakcjami i budowania komponentów wielokrotnego użytku w Haskell. Jest to niezbędne dla osób przyzwyczajonych do programowania obiektowego (oo), ponieważ normalne metody abstrakcji oo (klasy oo) nie pojawiają się w Haskell (Haskell ma klasy typów, ale bardzo różnią się od klas oo, bardziej jak interfejsy oo ). Nie sądzę, że dobrym pomysłem jest pomijanie rozdziałów, ponieważ każdy wprowadza wiele nowych pomysłów, które są używane w późniejszych rozdziałach.

Po chwili przejdziesz do rozdziału 14, przerażającego rozdziału monad (dum dum dummmm). Niemal każdy, kto uczy się Haskella, ma problem ze zrozumieniem monad, z powodu tego, jak abstrakcyjna jest ta koncepcja. Nie mogę wymyślić żadnej koncepcji w innym języku, która byłaby tak abstrakcyjna, jak monady w programowaniu funkcjonalnym. Monady pozwalają na ujednolicenie wielu pomysłów (takich jak operacje We / Wy, obliczenia, które mogą się nie powieść, parsowanie, ...) w ramach jednego pomysłu. Więc nie zniechęcaj się, jeśli po przeczytaniu rozdziału o monadach tak naprawdę ich nie rozumiesz. Przydało mi się czytać wiele różnych wyjaśnień monad; każdy daje nowe spojrzenie na problem. Oto bardzo dobra lista samouczków dotyczących monady . Bardzo polecam All About Monads , ale inne też są dobre.

Ponadto koncepcja naprawdę długo się zapełnia. Dzieje się tak dzięki użyciu, ale także z czasem. Uważam, że czasami sen na problemie pomaga bardziej niż cokolwiek innego! W końcu pomysł kliknie i będziesz się zastanawiać, dlaczego starałeś się zrozumieć koncepcję, która w rzeczywistości jest niezwykle prosta. To jest niesamowite, kiedy to się dzieje, a kiedy tak się dzieje, może się okazać, że Haskell jest twoim ulubionym imperatywnym językiem programowania :)

Aby upewnić się, że doskonale rozumiesz system typu Haskell, powinieneś spróbować rozwiązać 20 pośrednich ćwiczeń haskell . Ćwiczenia wykorzystujące zabawne nazwy funkcji takich jak „furry” i „banana” i pomagają dobrze zrozumieć niektóre podstawowe koncepcje programowania funkcjonalnego, jeśli jeszcze ich nie masz. Miły sposób na spędzenie wieczoru z bukietem papierów pokrytych strzałami, jednorożcami, kiełbasami i puszystymi bananami.

Pośredni

Kiedy zrozumiesz Monady, myślę, że dokonałeś przejścia z początkującego programisty Haskell na pośredniego haskellera. Gdzie więc iść? Pierwszą rzeczą, którą poleciłbym (jeśli jeszcze nie nauczyłeś się ich z nauki monad), są różne typy monad, takie jak Reader, Writer i State. Ponownie, Real world Haskell i All about monads doskonale to opisuje. Aby ukończyć trening monady, niezbędna jest znajomość transformatorów monad. Umożliwiają one łączenie różnych typów monad (takich jak czytnik i monada stanowa) w jedną. Na początku może się to wydawać bezużyteczne, ale po pewnym czasie będziesz się zastanawiać, jak żyłeś bez nich.

Teraz możesz dokończyć książkę Haskell z prawdziwego świata, jeśli chcesz. Pomijanie rozdziałów nie ma teraz większego znaczenia, pod warunkiem, że masz monady. Po prostu wybierz to, co Cię interesuje.

Mając wiedzę, którą posiadasz teraz, powinieneś być w stanie korzystać z większości pakietów na Cabal (przynajmniej te udokumentowane przynajmniej ...), a także z większości bibliotek dostarczanych z Haskell. Lista interesujących bibliotek do wypróbowania to:

  • Parsec : do analizowania programów i tekstu. O wiele lepsze niż używanie wyrażeń regularnych. Doskonała dokumentacja, zawiera także rozdział Haskell z prawdziwego świata.

  • QuickCheck : bardzo fajny program do testowania. Twoim zadaniem jest napisanie predykatu, który zawsze powinien być prawdziwy (np length (reverse lst) == length lst.). Następnie przekazujesz predykat QuickCheck, który wygeneruje wiele losowych wartości (w tym przypadku list) i sprawdzi, czy predykat jest prawdziwy dla wszystkich wyników. Zobacz także instrukcję online .

  • HUnit : Testy jednostkowe w Haskell.

  • gtk2hs : Najpopularniejszy framework GUI dla Haskell, pozwala pisać aplikacje gtk w Haskell.

  • happstack : platforma programistyczna dla Haskell. Nie używa baz danych, zamiast magazynu typów danych. Całkiem dobre dokumenty (inne popularne frameworki to snap i yesod ).

Ponadto istnieje wiele koncepcji (takich jak koncepcja Monady), których powinieneś się nauczyć. Będzie to łatwiejsze niż nauka Monad za pierwszym razem, ponieważ twój mózg będzie przyzwyczajony do radzenia sobie z poziomem abstrakcji. Bardzo dobrym przeglądem do poznania tych pojęć wysokiego poziomu i ich wzajemnego dopasowania jest Typeclassopedia .

  • Dotyczy: interfejs taki jak Monady, ale mniej wydajny. Każda monada ma zastosowanie, ale nie odwrotnie. Jest to przydatne, ponieważ niektóre typy mają zastosowanie, ale nie są monadami. Ponadto kod napisany przy użyciu funkcji aplikacyjnych jest często łatwiejszy do skomponowania niż zapisanie równoważnego kodu przy użyciu funkcji Monada. Zobacz Functors, Applicative Functors i Monoids z podręcznika haskell.

  • Składany , przesuwny : Typeclasses że streszczenie wielu operacji list, tak, że te same funkcje mogą być stosowane do innych typów kontenerów. Zobacz także objaśnienie wiki haskell .

  • Monoid : Monoid to typ, który ma wartość zero (lub mempty) i zapisaną operację, <>która łączy dwa Monoidy razem, takie jak x <> mempty = mempty <> x = xi x <> (y <> z) = (x <> y) <> z. Są to tak zwane prawa tożsamości i stowarzyszenia. Wiele typów to Monoidy, takie jak liczby, z mempty = 0i <> = +. Jest to przydatne w wielu sytuacjach.

  • Strzałki : strzałki są sposobem reprezentowania obliczeń, które pobierają dane wejściowe i zwracają dane wyjściowe. Funkcja jest najbardziej podstawowym rodzajem strzałki, ale istnieje wiele innych typów. Biblioteka ma również wiele bardzo przydatnych funkcji do manipulowania strzałkami - są one bardzo przydatne, nawet jeśli są używane tylko ze zwykłymi starymi funkcjami Haskell.

  • Tablice : różne zmienne / niezmienne tablice w Haskell.

  • ST Monada : pozwala pisać kod ze zmiennym stanem, który działa bardzo szybko, a jednocześnie pozostaje czysty poza monadą. Zobacz link po więcej szczegółów.

  • FRP: Functional Reactive Programming, nowy, eksperymentalny sposób pisania kodu, który obsługuje zdarzenia, wyzwalacze, dane wejściowe i wyjściowe (takie jak GUI). Ale niewiele o tym wiem. Rozmowa Paula Hudaka o yampie to dobry początek.

Jest wiele nowych funkcji językowych, na które powinieneś spojrzeć. Po prostu je wymienię , możesz znaleźć wiele informacji na ich temat z Google, wikibook haskell , strony haskellwiki.org i dokumentacji ghc .

  • Klasy typów wieloparametrowych / zależności funkcjonalne
  • Wpisz rodziny
  • Typy egzystencjalne
  • Typy fantomów
  • GADTS
  • inni ...

Wiele Haskell opiera się na teorii kategorii , więc warto się temu przyjrzeć. Dobrym punktem wyjścia jest teoria kategorii dla informatyków . Jeśli nie chcesz kupować książki, artykuł autora jest również doskonały.

Na koniec będziesz chciał dowiedzieć się więcej o różnych narzędziach Haskell. Obejmują one:

  • ghc (i wszystkie jego funkcje)
  • cabal : system pakietów Haskell
  • darcs : rozproszony system kontroli wersji napisany w Haskell, bardzo popularny w programach Haskell.
  • plamiak : automatyczny generator dokumentacji Haskell

Ucząc się tych wszystkich nowych bibliotek i pojęć, bardzo przydatne jest pisanie umiarkowanego projektu w Haskell. Może to być wszystko (np. Mała gra, analizator danych, strona internetowa, kompilator ). Praca nad tym pozwoli ci zastosować wiele rzeczy, których się teraz uczysz. Pozostajesz na tym poziomie przez wieki (tutaj jestem).

Ekspert

Dojście do tego etapu zajmie ci lata (cześć od 2009 roku!), Ale sądzę, że zaczynasz pisać prace doktorskie, nowe rozszerzenia ghc i wymyślać nowe abstrakcje.

Otrzymywać pomoc

Wreszcie na każdym etapie nauki istnieje wiele miejsc, w których można uzyskać informacje. To są:

  • kanał irc #haskell
  • z list dyskusyjnych . Warto zapisać się, aby po prostu przeczytać dyskusje, które odbywają się - niektóre są bardzo interesujące.
  • inne miejsca wymienione na stronie głównej haskell.org

Wniosek

Okazało się to dłużej, niż się spodziewałem ... W każdym razie uważam, że bardzo dobrym pomysłem jest opanowanie Haskell. To zajmuje dużo czasu, ale dzieje się tak głównie dlatego, że uczysz się zupełnie nowego sposobu myślenia. To nie jest jak nauka języka Ruby po nauce języka Java, ale jak nauka języka Java po nauce języka C. Odkryłem również, że moje umiejętności programowania obiektowego poprawiły się w wyniku nauki języka Haskell, ponieważ widzę wiele nowych sposobów abstrakcji pomysłów.

David Miani
źródło
35
Strzały! Najpierw pozwalasz monadom kształtować mózg, potem stajesz na głowie i myślisz o comonadach, a potem robisz oba jednocześnie, aby uzyskać strzały :) W Haskell jest dużo ekspresyjnej mocy, którą można otworzyć za pomocą poziomu tekstu programowanie też.
ephemient
13
@nanothief Monadma większą moc, ale także mniej kompozycyjny ... wiele osób korzysta z monad, w których mogliby uniknąć czystszego Applicativekodu. Większość rzeczy, które są, Functorsą również Monad, ale nie używasz >>=i returnkiedy fmapto wystarczy, ponieważ to drugie prowadzi do znacznie prostszego kodu, jeśli możesz go użyć.
Tom Crockett,
8
@pelotom, dodałem link do typeclassopedia, a także lepsze powody, aby używać aplikacji Applicative w tej sekcji i usunąłem sekcję Functor. Trudno jest uporządkować koncepcje Monady i Zastosowań we właściwej kolejności, ponieważ nacisk kładziony jest na Monady w większości materiałów dydaktycznych (w tym RWH). Z drugiej strony, nauczenie cię samouczka haskell przeszedł długą drogę, odkąd początkowo napisałem odpowiedź (prawie 2 lata: O), i uczy Aplikacji przed Monadą, być może powinien to być teraz zalecany sposób nauki haskell.
David Miani,
2
Dobra rada. Zacząłem to ponad rok temu i przeważnie przechodzę przez etap Średniozaawansowany. Informacje zwrotne: rozdział monady RWH (rozdział 14) jest słabo wyjaśniony. Czytanie internetowej wersji RWH jest korzystne, ponieważ zawiera komentarze społeczności, które pomagają w rozdziale. FWIW, You Could Have Invented Monads , to samouczek dotyczący monad, który działał najlepiej dla mnie.
Tom
6
@tomf: Dzięki! Zawsze byłem zdumiony, jak dobrze poradziła sobie ta odpowiedź - od jej napisania minęło prawie pięć lat, ale wciąż jest silna. Niedługo będę musiał go zaktualizować, ponieważ jest on trochę nieaktualny. Nie wspomina o soczewkach, rurkach, rodzajach ograniczeń, platformie haskell, liczbach poziomów typów i są to całkiem nowe ważne tematy, odkąd to zostało napisane. Masz rację, że RWH nie jest już tak dobry, nie był aktualizowany od dłuższego czasu i wiele przykładów się nie kompiluje. Cieszę się, że i tak było ci to pomocne.
David Miani
179

Mój kolega miał dobre doświadczenie z Learn You a Haskell for Great Good! .

Samouczek przeznaczony dla osób, które mają doświadczenie w imperatywnych językach programowania, ale nie programowały wcześniej w języku funkcjonalnym.

I sprawdź odpowiedzi tutaj zbyt

jittera
źródło
27
Popieram to. Ponadto, ponieważ nie jest to oczywiste, oto link do wersji pdf samouczka do pobrania: learnyouahaskell.com/learnyouahaskell.pdf Projekt strony jest świetny, ale lubię mieć kopię dla metra.
Telemachus
8
Zacząłem od tego, ale moim zdaniem powinieneś przejść bezpośrednio do Real World Haskell. Różnica polega na uczeniu się C z K&R lub „C dla manekinów”, który stara się być prosty, ale brakuje mu ważnego podejścia. Myślę, że lepiej jest po prostu wyjaśnić fakty, niż próbować nauczyć się Haskell „w trybie rozkazującym”.
John Smith,
7
Uwielbiam to i zainwestowałem dużo czasu w to i Real World Haskell. IMO, „Learn You a Haskell” daje głębszy wgląd niż Real World Haskell, chociaż oba są świetnymi zasobami.
Charlie Flowers,
7
@ abababa22 Myślę, że najpierw warto przeczytać LYAH, a następnie udać się do RWH. LYAH nie uczy cię tylko Haskell; uczy programowania funkcjonalnego. Zaczynasz myśleć funkcjonalnie, kiedy rozwiązujesz problemy. Najwyraźniej tylko LYAH nie wystarczyłoby do napisania dużej aplikacji, ale zgina twój umysł we właściwy sposób. Jeśli pochodzisz z konieczności, jest to najlepszy sposób, IMO
Abdulsattar Mohammed
4
@ Telemachus Uwaga: PDF nie jest ostateczną wersją, przynajmniej brakuje ostatniego rozdziału.
sdcvvc
103

Oto dobra książka, którą możesz przeczytać online: Real World Haskell

Większość programów Haskell, które zrobiłem, ma na celu rozwiązanie problemów z Project Euler .

Pewna rada, którą czytałem nie tak dawno temu, była taka, że ​​powinieneś mieć standardowy zestaw prostych problemów, które wiesz, jak rozwiązać (teoretycznie), a następnie za każdym razem, gdy próbujesz nauczyć się nowego języka, wdrażasz te problemy w tym języku.

David Johnstone
źródło
2
Z mojego doświadczenia wynika, że ​​Real World Haskell jest świetny, dopóki nie przejdziesz do rozdziału 5. Od tej pory nie polecałbym go.
MasterMastic
Dlaczego @MasterMastic? Jaki jest problem poza rozdziałem 5? Chciałbym wiedzieć, zanim wydam pieniądze.
Jay Blanchard
@JayBlanchard W rozdziale 5 zaczynasz uzyskiwać konkretny przykład biblioteki, co jest miłe, ale mówią ci, co zamierzają zrobić, zrób to, ale nie wyjaśniają dlaczego całkowicie, i wcale nie są jasne, i jest sporo magicznych liter szesnastkowych. Po prostu przechodzisz przez ruchy. To nie był dla mnie największy problem, największym problemem było to, że książka w dużej mierze zależy od tego rodzaju twardych i długich przykładów (wystarczająco długo, aby zabrać więcej niż cały rozdział). Prawie nie możesz po prostu przeczytać części, które chcesz. Myślę, że świetni autorzy, niesamowita wiedza, ale wyjątkowo słaba realizacja.
MasterMastic
69

Aby dodać odpowiedzi innych - jest jedna przydatna, która pomoże ci w kodowaniu (na przykład przy rozwiązywaniu problemów z projektem Euler): Hoogle . Możesz użyć interfejsu wiersza polecenia lub interfejsu internetowego .

Wiersz poleceń

Po zainstalowaniu platformy Haskell koniecznie cabal install hoogle

Przykład użycia Hoogle:

Masz funkcję f x = 3 * x + 1i chcesz ją zastosować (5 :: Int), a następnie zastosować do wyniku i do tego wyniku itd. I uzyskać nieskończoną listę tych wartości. Podejrzewasz, że może już istnieć funkcja, która może ci pomóc (ale nie specjalnie dla ciebie f).

Ta funkcja byłaby typu, (a -> a) -> a -> [a]jeśli zajmie f 5lub a -> (a -> a) -> [a]zajmie 5 f(zakładamy, że funkcja dotyczy typów ogólnych, a nie tylko Ints)

$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]

tak, funkcja, której potrzebujesz, już istnieje i jest wywoływana iterate. korzystasz z tego przez iterate func 5!

interfejs sieciowy

Wynik dla tego samego przykładu można znaleźć tutaj .

yairchu
źródło
Znalezienie standardowych funkcji bibliotecznych dla potrzeb jest o wiele łatwiejsze, gdy zrozumiesz, jak poprosić Hoogle o to, czego potrzebujesz.
ankh-morpork
57

Programowanie Grahama Huttona w Haskell jest zwięzłe, dość dokładne, a jego lata nauki Haskella naprawdę pokazują. Prawie zawsze to, od czego polecam, ludzie zaczynają, bez względu na to, dokąd idziesz.

W szczególności rozdział 8 („Parsery funkcjonalne”) zapewnia prawdziwe podstawy do rozpoczęcia pracy z monadami i myślę, że jest to zdecydowanie najlepsze miejsce na rozpoczęcie, a następnie All About Monads . (Jednak w odniesieniu do tego rozdziału zwróć uwagę na erratę ze strony internetowej: nie możesz użyć tego doformularza bez specjalnej pomocy. Możesz najpierw dowiedzieć się o klasach typów i rozwiązać ten problem samodzielnie).

Rzadko podkreśla się to dla początkujących w Haskell, ale warto dość wcześnie nauczyć się nie tylko korzystania z monad, ale także konstruowania własnych. Nie jest to trudne, a dostosowane mogą sprawić, że wiele zadań będzie prostszych.

Curt Sampson
źródło
5
Jest to książka całkowicie niedoceniana (i odpowiedź). Rozdział o parserach funkcjonalnych, a następnie rozdział o IO, z których żaden nawet nie wspomina o monadach, naprawdę błyszczy jako eleganckie podejście pedagogiczne.
michiakig
52

Nie próbuj czytać wszystkich samouczków monad ze śmiesznymi metaforami. Sprawią, że jeszcze bardziej się pomieszasz.

John Smith
źródło
5
Zgoda! Patrz „Abstrakcja, intuicja i„ błędny samouczek monady ””: byorgey.wordpress.com/2009/01/12/…
ShreevatsaR
31

Proponuję dołączyć do kanału irc #haskell i zadawać tam pytania. Tak nauczyłem się Haskella. Jeśli przejdziesz przez Real World Haskell, jak sugerowano powyżej, odpowiedzi w czasie rzeczywistym na twoje pytania bardzo pomogą. Wielu inteligentnych ludzi na #haskell pisze Haskell dla zabawy i zysku, więc dostaniesz dużo dobrego wkładu. Spróbuj!

shapr
źródło
5
+1 - Żeby było jasne: nie ucz się tego tylko z kanałem irc. Nie wchodź i nie pytaj: „Jak napisać program Haskell? Jak dodawać liczby?”
alternatywnie
Oprócz irc freenode, ostatnio toczy się ożywiona dyskusja na temat haskell w czatach Discord.
typelogic
19

Mogę dodatkowo polecić Yet Another Tutorial Haskell jako wprowadzenie.

Innym dobrym materiałem do nauki (prawdopodobnie na poziomie pośrednim), który bardzo mi pomógł i nie został wymieniony w innych odpowiedziach, o ile widzę, jest Typeclassopedia Brenta Yorgeya , którą można znaleźć w The Monad Reader (Issue 13)

Jest napisany w bardzo przystępnym stylu i zawiera (między innymi) następującą poradę wprowadzającą:

Istnieją dwa klucze do mądrości hakera eksperta Haskella:

  1. Zrozum typy.

  2. Zdobądź głęboką intuicję dla każdej klasy typu i jej związek z innymi klasami typu, poparty znajomością wielu przykładów.

Sam Monad Reader jest absolutną skarbnicą dla programistów funkcjonalnych (nie tylko programistów Haskell).

Greg S.
źródło
14

Spróbuj napisać w nim łatwe programy.

Prawdopodobnie możesz znaleźć przykładowe zadania w różnych podręcznikach.

Nie polecałbym trzymania się podręczników Haskell / FP, po prostu spróbuj robić z nim proste rzeczy: obliczenia, manipulacje ciągami, dostęp do plików.

Po rozwiązaniu tuzina przełamałem lody :)

Następnie przeczytaj dużo na temat zaawansowanych pojęć (Monady, Strzałki, IO, rekurencyjne struktury danych), ponieważ haskell jest nieskończony i jest ich wiele.

Alamar
źródło
14

Wydaje mi się, że uświadomienie sobie funkcji Haskella za pomocą przykładów jest najlepszym sposobem na rozpoczęcie przede wszystkim.

http://en.wikipedia.org/wiki/Haskell_98_features

Oto trudne typy, w tym monady i strzały

http://www.haskell.org/haskellwiki/Typeclassopedia

w przypadku rzeczywistych problemów i większych projektów zapamiętaj te tagi: GHC (najczęściej używany kompilator), Hackage (libraryDB), Cabal (system budowania), darcs (inny system budowania).

Zintegrowany system może zaoszczędzić Twój czas: http://hackage.haskell.org/platform/

baza danych pakietów dla tego systemu: http://hackage.haskell.org/

Wiki kompilatora GHC: http://www.haskell.org/haskellwiki/GHC

Po Haskell_98_features i Typeclassopedia myślę, że już możesz sam znaleźć i przeczytać dokumentację na ich temat

Nawiasem mówiąc, możesz chcieć przetestować rozszerzenie językowe GHC, które może być częścią standardu haskell w przyszłości.

to mój najlepszy sposób na naukę haskell. mam nadzieję, że ci to pomoże.

śnieżkami i lodami
źródło
13

Proponuję zacząć od przeczytania samouczka BONUS , a następnie przeczytania Real World Haskell (online za darmo) . Dołącz do kanału IRC #Haskell na irc.freenode.com i zadawaj pytania. Ci ludzie są całkowicie przyjaźni dla początkujących i z czasem bardzo mi pomogli. Również tutaj, na SO, jest świetne miejsce do uzyskania pomocy w sprawach, których nie można pojąć! Staraj się nie zniechęcać, gdy kliknie, twój umysł zostanie wysadzony w powietrze.

Samouczek BONUS sprawi, że poczujesz się lepiej i przygotujesz się na emocjonującą jazdę, którą przynosi Real World Haskell. Życzę szczęścia!

Rayne
źródło
12

Jeśli masz tylko doświadczenie z językami imperatywnymi / OO, sugeruję użycie bardziej konwencjonalnego języka funkcjonalnego jako odskoczni. Haskell jest naprawdę inny i musisz zrozumieć wiele różnych koncepcji, aby dostać się gdziekolwiek. Proponuję najpierw zająć się językiem w stylu ML (jak np. F #).

JacquesB
źródło
Wiąz może być najbliższym, bardziej użytecznym i przyjaznym dla początkujących z tych alternatyw ...
Pedro Rolo
1
Nie zgadzam się na przejście przez tymczasową trasę, taką jak F #. Dla mnie to tak, jakby pić wódkę, którą trzeba szybko wypić. Bardziej bolesne, ale jest też przyjemność. Tymczasowe trasy prowadzą tylko do większego zamieszania.
typelogic
10

Pierwsza odpowiedź jest bardzo dobra. Aby dostać się na poziom eksperta, powinieneś zrobić doktorat z udziałem niektórych ekspertów.

Proponuję odwiedzić stronę Haskell: http://haskell.org . Znajdziesz tam wiele materiałów i wiele odniesień do najbardziej aktualnych rzeczy w Haskell, zatwierdzonych przez społeczność Haskell.

Fidel
źródło
2
Przepraszam, ale użycie argumentu doktora jest jak powiedzenie, że musisz mieć nóż kuchenny o wartości 300 $, aby być dobrym szefem kuchni. Nawet Simon Peyton Jones - ojciec Haskella - nie ma doktoratu. Praktyka i wytrwałość prowadzą do ekspertyzy zarówno tutaj, jak i w każdej innej dziedzinie.
Petras Purlys