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

В течение нескольких дней я пытался обернуть голову вокруг парадигмы функционального программирования в Haskell. Я сделал это, читая учебные пособия и просматривая скринкасты, но на самом деле, похоже, ничего не осталось. Теперь, при изучении различных императивных /OO-языков (таких как C, Java, PHP), упражнения были хорошим способом для меня. Но так как я не знаю, на что способен Haskell, и поскольку есть много новых концепций, которые я могу использовать, я не знаю, с чего начать.

Итак, как вы узнали Хаскель? Что заставило тебя действительно "сломать лед"? Кроме того, есть хорошие идеи для начала упражнений?

15 ответов

Решение

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

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

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

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

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

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

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

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

начинающий

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

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

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

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

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

промежуточный

Как только вы поймете Monads, я думаю, что вы перешли от начинающего программиста haskell к промежуточному haskeller. Так куда же идти? Первое, что я бы порекомендовал (если вы еще не изучили их из изучения монад), это различные типы монад, такие как Reader, Writer и State. Опять же, Реальный мир haskell и All about monads дают отличное освещение этого. Для завершения обучения монаде изучение монадных трансформаторов является обязательным. Это позволяет вам объединять разные типы монад (например, читатель и монаду состояния) в одну. Это может показаться бесполезным с самого начала, но после некоторого использования вы будете удивляться, как вы жили без них.

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

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

  • Parsec: для разбора программ и текста. Гораздо лучше, чем с помощью регулярных выражений. Отличная документация, также есть глава в реальном мире.

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

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

  • gtk2hs: самый популярный графический интерфейс для haskell, позволяет писать приложения на gtk на haskell.

  • http://happstack.com/: инфраструктура веб-разработки для haskell. Не использует базы данных, вместо этого хранилище типов данных. Довольно хорошие документы (другие популярные фреймворки были бы очень удобными).

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

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

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

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

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

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

  • ST Monad: позволяет вам писать код с изменяемым состоянием, которое работает очень быстро, но остается чистым вне монады. Пройдите по ссылке, чтобы узнать больше.

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

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

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

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

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

  • GHC (и все его особенности)
  • Кабал: система пакетов haskell
  • darcs: распределенная система контроля версий, написанная на haskell, очень популярная для программ на haskell.
  • пикша: автоматический генератор документации haskell

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

эксперт

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

Получать помощь

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

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

Заключение

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

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

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

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

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

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

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

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

C9 Лекции: д-р Эрик Мейер - Основы функционального программирования: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/

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

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

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

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

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

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

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

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

веб интерфейс

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

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

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

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

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

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

Это мои любимые

Haskell: функциональное программирование с типами

Joeri van Eekelen, et al. | Wikibooks
       Published in 2012, 597 pages

Реальный мир Haskell

   B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc.
   Published in 2008, 710 pages

Я могу дополнительно порекомендовать еще одно руководство по Haskell в качестве введения.

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

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

Есть два ключа к мудрости опытного хакера из Haskell:

  1. Понять типы.

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

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

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

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

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

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

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

Я действительно думаю, что реализация возможностей Haskell на примерах - лучший способ начать прежде всего.

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

Вот хитрые классы типов, включая монады и стрелки

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

для реальных задач и больших проектов запомните эти теги: GHC(наиболее часто используемый компилятор), Hackage(libraryDB), Cabal(система сборки), darcs(еще одна система сборки).

Интегрированная система может сэкономить ваше время: http://hackage.haskell.org/platform/

база данных пакетов для этой системы: http://hackage.haskell.org/

Вики компилятора GHC: http://www.haskell.org/haskellwiki/GHC

После Haskell_98_features и Typeclassopedia, я думаю, вы уже можете найти и прочитать документацию о них сами

Кстати, вы можете протестировать расширение некоторых языков GHC, которое в будущем может стать частью стандарта haskell.

это мой лучший способ изучения хаскелла. Я надеюсь, что это может помочь вам.

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

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

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

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

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

Другие вопросы по тегам