Начало работы с Haskell

У меня был тот же вопрос и я решил проблему. В моем случае брандмауэр Windows (а не маршрутизатор) блокировал ввод / вывод V8 на хост-машине.

  1. Перейти к окну кнопки
  2. Поиск «Брандмауэр»
  3. Выберите «Разрешить программам общаться через брандмауэр»
  4. Нажмите «Изменить настройку»
  5. Отметьте все «Evented I / O для V8 Javascript» ИЛИ «Node.js» : Javascript на стороне сервера

Я предполагаю, что «Evented I / O для V8 Javascript» - это процесс ввода-вывода, который node.js связывается с внешним миром, и нам нужно его освободить прежде чем он сможет отправлять пакеты за пределы локального компьютера. После включения этой программы для связи через брандмауэр Windows я мог бы использовать любые номера портов для прослушивания.

756
задан 3 revs, 3 users 60% 25 February 2013 в 19:14
поделиться

13 ответов

Я собираюсь упорядочить это руководство по уровню вашего мастерства в Haskell, от абсолютного новичка до эксперта. Обратите внимание, что этот процесс займет много месяцев (лет?), Поэтому он довольно долгий.

Абсолютный новичок

Во-первых, Haskell способен на все, при наличии достаточных навыков. Это очень быстро (по моему опыту уступает только C и C ++) и может использоваться для чего угодно, от моделирования до серверов, графических интерфейсов и веб-приложений.

Однако есть некоторые проблемы, которые легче написать новичку на Haskell, чем другие. Математические задачи и программы обработки списков являются хорошими кандидатами для этого, поскольку они требуют только самых элементарных знаний Haskell, чтобы уметь писать.

Во-первых, Вот несколько хороших руководств по изучению основ Haskell - это учебник по хаскеллу и первые 6 глав по изучению хаскелла . Читая их, неплохо было бы также решать простые проблемы с помощью того, что вы знаете.

Еще два хороших ресурса - это Программирование на Haskell из первых принципов и Программирование на Haskell ]. В обоих есть упражнения для каждой главы, так что у вас есть небольшие простые задачи, соответствующие тому, что вы узнали на нескольких последних страницах.

Хороший список задач, которые стоит попробовать, - это страница haskell 99 задач . Они начинаются с очень простых вещей и по мере продвижения усложняются. Выполнение многих из них - очень хорошая практика, поскольку они позволяют практиковать свои навыки в рекурсии и функциях более высокого порядка. Я бы рекомендовал пропустить любые задачи, требующие случайности, поскольку в Haskell это немного сложнее. Отметьте этот вопрос SO на случай, если вы хотите протестировать свои решения с помощью QuickCheck (см. Промежуточный ниже).

После того, как вы выполнили несколько из них, вы можете перейти к выполнению некоторые из проблем проекта Эйлера . Они отсортированы по количеству людей, выполнивших их, что является довольно хорошим показателем сложности. Они проверяют вашу логику и Haskell больше, чем предыдущие задачи, но вы все равно сможете выполнить несколько первых. Большое преимущество Haskell в решении этих проблем заключается в том, что целые числа не ограничены в размере. Чтобы решить некоторые из этих задач, будет полезно прочитать главы 7 и 8 из руководства по изучению Haskell.

Начинающий

После этого у вас должно быть достаточно хорошее представление о рекурсии и функциях высшего порядка, так что было бы хорошее время, чтобы начать решать еще несколько реальных задач. Очень хорошее место для начала - Real World Haskell (онлайн-книга, вы также можете приобрести бумажную копию). Я обнаружил, что первые несколько глав вводятся слишком быстро для человека, который никогда раньше не занимался функциональным программированием / не использовал рекурсию. Однако с практикой, которую вы могли бы получить от решения предыдущих задач, вы найдете это совершенно понятным.

Работа над проблемами, описанными в книге, - отличный способ научиться управлять абстракциями и создавать повторно используемые компоненты в Haskell. Это жизненно важно для людей, привыкших к объектно-ориентированному (oo) программированию, поскольку обычные методы абстракции (oo-классы) не действуют. t появляются в Haskell (в Haskell есть классы типов, но они сильно отличаются от классов oo, больше похожи на интерфейсы oo). Я не думаю, что будет хорошей идеей пропускать главы, так как каждая представляет множество новых идей, которые используются в последующих главах.

Через некоторое время вы перейдете к главе 14, главе о страшных монадах (dum dum dummmm) . Почти каждый, кто изучает Haskell, испытывает проблемы с пониманием монад из-за абстрактности концепции. Я не могу придумать ни одной концепции на другом языке, столь же абстрактной, как монады в функциональном программировании. Монады позволяют объединить многие идеи (например, операции ввода-вывода, вычисления, которые могут дать сбой, синтаксический анализ и т. Д.) В одной идее. Так что не расстраивайтесь, если после прочтения главы о монадах вы их не поймете. Я счел полезным прочитать много разных объяснений монад; каждый дает новый взгляд на проблему. Вот очень хороший список руководств по монаде . Я настоятельно рекомендую All About Monads , но и другие тоже хороши.

Кроме того, требуется время, чтобы концепции по-настоящему усвоились. Это происходит через использование, но также и через время. Я считаю, что иногда сон, связанный с проблемой, помогает больше, чем что-либо другое! В конце концов, идея откроется, и вы удивитесь, почему вы изо всех сил пытались понять концепцию, которая на самом деле невероятно проста. Когда это происходит, это здорово, и когда это происходит, вы можете найти Haskell своим любимым языком императивного программирования :)

Чтобы убедиться, что вы прекрасно понимаете систему типов Haskell, вам следует попытаться решить 20 промежуточных упражнения haskell . Эти упражнения с забавными названиями функций вроде " Поначалу это может показаться бесполезным, но после использования их в течение некоторого времени вы удивитесь, как вы жили без них.

Теперь вы можете закончить настоящую книгу по Haskell, если хотите. Пропуск глав теперь не имеет значения, если у вас есть монады. Просто выберите то, что вас интересует.

Обладая знаниями, которые у вас есть сейчас, вы сможете использовать большинство пакетов в Cabal (ну, по крайней мере, документированные ...), а также большинство библиотек которые поставляются с Haskell. Вот список интересных библиотек, которые стоит попробовать:

  • Parsec : для анализа программ и текста. Намного лучше, чем использовать регулярные выражения. Отличная документация, также есть глава о реальном Haskell.

  • QuickCheck : Очень крутая программа для тестирования. Вам нужно написать предикат, который всегда должен быть истинным (например, length (reverse lst) == length lst ). Затем вы передаете предикат QuickCheck, и он генерирует множество случайных значений (в данном случае списков) и проверяет, что предикат истинен для всех результатов. См. Также онлайн-руководство .

  • HUnit : модульное тестирование в Haskell.

  • gtk2hs : самый популярный графический интерфейс для Haskell, позволяет писать приложения gtk на Haskell. 1272] Happystack : Фреймворк веб-разработки для Haskell. Не использует базы данных, вместо этого хранилище типов данных. Довольно неплохая документация (другими популярными фреймворками могут быть snap и yesod ).

Кроме того, есть много концепций (например, концепция Monad), которые вам в конечном итоге следует изучить. Это будет проще, чем изучить Монады в первый раз, поскольку ваш мозг будет иметь дело с задействованным уровнем абстракции. Очень хороший обзор для изучения этих высокоуровневых концепций и того, как они сочетаются друг с другом, - это Typeclassopedia .

  • Аппликативный: интерфейс, подобный Monads, но менее мощный. Каждая монада аппликативна, но не наоборот. Это полезно, поскольку есть некоторые типы, которые являются аппликативными, но не являются монадами. Кроме того, код, написанный с использованием функций Applicative, часто является более компонуемым, чем написание эквивалентного кода с использованием функций Monad. См. Функторы, аппликативные функторы и моноиды из руководства по haskell.

  • Foldable , Traversable : классы типов, которые абстрагируют многие операции со списками, так что те же функции могут быть применены к другим типам контейнеров. См. Также объяснение haskell вики .

  • Моноид : Моноид - это тип, имеющий нулевое (или пустое) значение, и операцию, обозначенную <> , которая объединяет два моноида вместе, так что x <> mempty = mempty <> x = x и x <> (y <> z) = (x <> y) <> z . Они называются законами тождества и ассоциативности. Многие типы являются моноидами, например числами, с mempty = 0 и <> = + . Это полезно во многих ситуациях.

  • Стрелки : Стрелки представляют собой способ представления вычислений, которые принимают ввод и возвращают вывод. Функция - это самый простой тип стрелок, но есть много других типов. В библиотеке также есть много очень полезных функций для управления стрелками - они очень полезны, даже если используются только с простыми старыми функциями Haskell.

  • Массивы : различные изменяемые / неизменяемые массивы в Haskell.

  • ST Monad ]: позволяет писать код с изменяемым состоянием, который выполняется очень быстро, оставаясь при этом чистым вне монады. Для получения дополнительной информации см. Ссылку

  • FRP: функциональное реактивное программирование, новый экспериментальный способ написания кода, который обрабатывает события, триггеры, входы и выходы (например, графический интерфейс). Хотя я мало что знаю об этом. Рассказ Пола Худака о ямпе - хорошее начало.

Есть много новых языковых функций, на которые вам стоит обратить внимание. Я просто перечислю их, вы можете найти много информации о них в Google, haskell wikibook , haskellwiki. сайт org и документация ghc .

  • Многопараметрические классы типов / функциональные зависимости
  • Семейства типов
  • Экзистенциально количественно определенные типы
  • Фантомные типы
  • GADTS
  • другие ...

Многое в Haskell основано на теории категорий , так что вы можете изучить ее. Хорошей отправной точкой является Теория категорий для компьютерных ученых . Если вы не хотите покупать книгу, вам также подойдет статья автора .

Наконец, вы захотите узнать больше о различных инструментах Haskell. К ним относятся:

  • ghc (и все его функции)
  • cabal : система пакетов Haskell
  • darcs : распределенная система контроля версий, написанная на Haskell, очень популярная для программ Haskell .
  • пикша : автоматический генератор документации Haskell

Изучая все эти новые библиотеки и концепции, очень полезно писать небольшой проект на Haskell. Это может быть что угодно (например, небольшая игра, анализатор данных, веб-сайт, компилятор ). Работа над этим позволит вам применить многие вещи, которые вы сейчас изучаете. Вы остаетесь на этом уровне целую вечность (вот где я).

Эксперт

Вам потребуются годы, чтобы добраться до этого уровня (привет из 2009 года!), Но с этого момента, я думаю, вы начнете написание статей на докторскую степень, новых расширений ghc и создание новых абстракций.

Получение помощи

Наконец, на любом этапе обучения есть несколько мест для получения информации. Это:

  • irc-канал #haskell
  • списки рассылки . На них стоит подписаться, чтобы просто прочитать происходящие обсуждения - некоторые из них очень интересны.
  • другие места, перечисленные на домашней странице haskell.org

Заключение

Ну, это оказалось дольше, чем я ожидал .. В любом случае, я думаю, что стать хорошим знатоком Haskell - это очень хорошая идея. На это уходит много времени, но в основном потому, что таким образом вы осваиваете совершенно новый способ мышления. Это не похоже на изучение Ruby после изучения Java, это похоже на изучение Java после изучения C. Кроме того, я обнаружил, что мои навыки объектно-ориентированного программирования улучшились в результате изучения Haskell, поскольку я вижу много новых способов абстрагирования идей.

Я думаю, что стать хорошим знатоком Haskell - это очень хорошая идея. На это уходит много времени, но в основном потому, что таким образом вы осваиваете совершенно новый способ мышления. Это не похоже на изучение Ruby после изучения Java, это похоже на изучение Java после изучения C. Кроме того, я обнаружил, что мои навыки объектно-ориентированного программирования улучшились в результате изучения Haskell, поскольку я вижу много новых способов абстрагирования идей.

Я думаю, что стать хорошим знатоком Haskell - это очень хорошая идея. На это уходит много времени, но в основном потому, что таким образом вы осваиваете совершенно новый способ мышления. Это не похоже на изучение Ruby после изучения Java, это похоже на изучение Java после изучения C. Кроме того, я обнаружил, что мои навыки объектно-ориентированного программирования улучшились в результате изучения Haskell, поскольку я вижу много новых способов абстрагирования идей.

2447
ответ дан 22 November 2019 в 21:26
поделиться

Не пытайтесь читать все руководства по монаде с забавными метафорами. Они только еще хуже запутают вас.

51
ответ дан 22 November 2019 в 21:26
поделиться

У моего коллеги был хороший опыт работы с Learn You a Haskell for Great Good! .

Учебное пособие для людей, у которых есть опыт императивного программирования языков, но не запрограммированы на функциональный язык раньше.

И проверьте ответы здесь тоже

176
ответ дан 22 November 2019 в 21:26
поделиться

Вот хорошая книга, которую вы можете прочитать в Интернете: Real World Haskell

Большинство программ на Haskell, которые я написал, были предназначены для решения Project Euler

Однажды я прочитал не так давно совет, что у вас должен быть стандартный набор простых задач, которые вы умеете решать (теоретически), а затем всякий раз, когда вы пытаетесь изучить новый язык, вы реализуете эти проблемы на этот язык.

102
ответ дан 22 November 2019 в 21:26
поделиться

Попробуйте писать на ней простые программы.

Вы, вероятно, можете найти образцы задач в различных учебниках.

Я бы не рекомендовал придерживаться учебников Haskell / FP, просто попробуйте делать с ними простые вещи: вычисления, манипуляции со строками, доступ к файлам.

После Я решил дюжину, я сломал лед :)

После этого много читайте по продвинутым концепциям (монады, стрелки, ввод-вывод, рекурсивные структуры данных), потому что haskell бесконечен, а их много.

14
ответ дан 22 November 2019 в 21:26
поделиться

Я предлагаю присоединиться к #haskell irc-каналу и задавать вопросы там. Так я изучил Haskell. Если вы пройдете через Real World Haskell, как предложено выше, ответы на ваши вопросы в режиме реального времени вам очень помогут. Многие умные люди на #haskell пишут Haskell для развлечения и ради прибыли, так что вы получите много хороших отзывов. Попробуйте!

31
ответ дан 22 November 2019 в 21:26
поделиться

Я предлагаю вам сначала прочитать учебник BONUS , а затем прочитать Real World Haskell (онлайн бесплатно) . Присоединяйтесь к #Haskell IRC-каналу на irc.freenode.com и задавайте вопросы. Эти люди абсолютно дружелюбны к новичкам и со временем очень мне помогли. Кроме того, прямо здесь, на SO, можно получить помощь в том, чего вы не можете понять! Постарайтесь не расстраиваться, как только он щелкнет, ваш мозг взорвется.

Учебник BONUS зарядит вас энергией и подготовит к захватывающей поездке, которую приносит Real World Haskell. Желаю удачи!

13
ответ дан 22 November 2019 в 21:26
поделиться

Если у вас есть опыт работы только с императивными / объектно-ориентированными языками , Я предлагаю использовать более традиционный функциональный язык как ступеньку. Haskell действительно отличается, и вам нужно понимать множество различных концепций, чтобы добиться чего-либо. Я предлагаю сначала заняться языком в стиле ML (например, F #).

Haskell действительно отличается, и вам нужно понимать множество различных концепций, чтобы добиться чего-либо. Я предлагаю сначала заняться языком в стиле ML (например, F #).

Haskell действительно отличается, и вам нужно понимать множество различных концепций, чтобы добиться чего-либо. Я предлагаю сначала заняться языком в стиле ML (например, F #).

12
ответ дан 22 November 2019 в 21:26
поделиться

Программирование на Haskell Грэма Хаттона лаконично, достаточно обстоятельно, и его годы преподавания Haskell действительно показывают. Почти всегда я рекомендую людям начинать, независимо от того, куда вы идете дальше.

В частности, глава 8 («Функциональные синтаксические анализаторы») дает реальную основу, необходимую для начала работы с монадами, и я думаю, что она намного лучше. лучше всего начать с All About Monads . (Что касается этой главы, тем не менее, обратите внимание на опечатки на веб-сайте: вы не можете использовать форму do без специальной помощи. Возможно, вы захотите сначала узнать о классах типов и решить эту проблему проблема сама по себе.)

Это редко подчеркивается новичками в Haskell, но это ' На раннем этапе стоит изучить не только использование монад, но и создание своих собственных. Это несложно, а индивидуальные решения могут значительно упростить ряд задач.

57
ответ дан 22 November 2019 в 21:26
поделиться

Чтобы добавить к другим ответам - есть один полезный, который поможет вам при кодировании (например, при решении задач Эйлера проекта): Google . Вы можете использовать интерфейс командной строки или веб-интерфейс .

Командная строка

После установки платформы Haskell обязательно cabal install hoogle

Пример использования Hoogle:

У вас есть функция fx = 3 * x + 1 , и вы хотите применить ее к (5 :: Int) , затем примените ее к результату и к этому результату и так далее и получите бесконечный список этих значений. Вы подозреваете, что может уже существовать функция, которая поможет вам (хотя не специально для вашего f ).

Эта функция будет иметь тип (a -> a) -> a -> [ a] , если требуется f 5 или a -> (a -> a) -> [a] , если требуется 5 f (мы предположим, что функция предназначена для общих типов, а не только для Int s)

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

да, нужная вам функция уже существует и называется iterate . вы используете его в iterate func 5 !

Веб-интерфейс

Результат для того же примера можно найти здесь .

69
ответ дан 22 November 2019 в 21:26
поделиться

Первый ответ очень хороший. Для того чтобы добраться до уровня Эксперта, вам следует сделать PhD с некоторыми из самих Экспертов.

Я предлагаю вам посетить страницу Haskell: http://haskell.org. Там есть много материала и много ссылок на самые последние материалы по Haskell, одобренные сообществом Haskell.

10
ответ дан 22 November 2019 в 21:26
поделиться

Мне понравилось смотреть эту серию из 13 эпизодов о функциональном программировании на языке Haskell.

Лекции C9: Dr. Erik Meijer - Functional Programming Fundamentals: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/

73
ответ дан 22 November 2019 в 21:26
поделиться

Я также могу порекомендовать Yet Another Haskell Tutorial в качестве введения.

Другим хорошим учебным ресурсом (вероятно, на среднем уровне), который мне очень помог и, насколько я понимаю, не упоминался в других ответах, является Typeclassopedia Брента Йорги, который можно найти в The Monad Reader (выпуск 13)

Она написана в очень доступном стиле и содержит (помимо всего прочего) следующие вводные советы:

Есть два ключа к Хакерская мудрость эксперта Haskell:

  1. Понимание типов.

  2. Получите глубокое понимание каждого класса типов и его связи с другими классы типов, подкрепленные знакомством со многими примерами.

Monad Reader сам по себе является настоящим сокровищем для функциональных программистов (не только программистов на Haskell).

19
ответ дан 22 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: