Я собираюсь заказать это руководство по уровню мастерства, которым вы обладаете в Хаскеле, от абсолютного новичка до эксперта. Обратите внимание, что этот процесс займет много месяцев (лет?), Поэтому он довольно долгий.
Абсолютный новичок
Во-первых, Haskell способен на все, с достаточным умением. Он очень быстрый (за моим опытом только C и C ++) и может использоваться для любых целей, от моделирования до серверов, графических приложений и веб-приложений.
Однако есть некоторые проблемы, которые легче написать новичку в Haskell, чем другие. Математические задачи и программы обработки списков являются хорошими кандидатами для этого, так как для их написания требуются только самые базовые знания Haskell.
Во - первых, некоторые хорошие руководства по обучению самые основы Haskell являются счастливыми узнать Haskell учебник и первые 6 глав узнать вам Haskell . Читая их, очень полезно также решать простые проблемы с тем, что вы знаете.
Еще два полезных ресурса - программирование на Haskell с первых принципов и программирование на Haskell. . Они оба поставляются с упражнениями для каждой главы, поэтому у вас есть небольшие простые проблемы, соответствующие тому, что вы узнали на последних нескольких страницах.
Хороший список проблем, которые нужно попробовать, это страница проблем на haskell 99 . Они начинаются очень просто и становятся сложнее по мере продвижения. Это очень хорошая практика, поскольку они позволяют вам практиковать свои навыки в рекурсии и функциях более высокого порядка. Я бы порекомендовал пропустить любые проблемы, которые требуют случайности, поскольку это немного сложнее в Haskell. Проверьте этот SO вопрос в случае , если вы хотите , чтобы проверить свои решения с QuickCheck (см Intermediate ниже).
После того, как вы сделали несколько из них, вы можете перейти к решению некоторых проблем Project Euler . Они отсортированы по тому, сколько людей их выполнили, что является довольно хорошим показателем сложности. Они проверяют вашу логику и Haskell больше, чем предыдущие проблемы, но вы все равно сможете сделать первые несколько. Большое преимущество, которое 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 к промежуточному хаскеллеру. Так куда же идти? Первое, что я бы порекомендовал (если вы еще не изучили их из изучения монад), это различные типы монад, такие как Reader, Writer и State. Опять же, Реальный мир на Haskell и All about monads дает хорошее освещение этого. Для завершения обучения монаде изучение монадных трансформаторов является обязательным. Это позволяет вам объединять разные типы монад (например, читатель и монаду состояния) в одну. Это может показаться бесполезным с самого начала, но после некоторого использования вы будете удивляться, как вы жили без них.
Теперь вы можете закончить книгу на Haskell в реальном мире, если хотите. Пропуск глав теперь не имеет особого значения, пока у вас нет монад. Просто выберите то, что вас интересует.
Обладая знаниями, которыми вы обладаете сейчас, вы сможете использовать большинство пакетов на cabal (по крайней мере, хорошо документированных), а также большинство библиотек, поставляемых с Haskell. Список интересных библиотек, которые можно попробовать:
Parsec : для разбора программ и текста. Гораздо лучше, чем с помощью регулярных выражений. Отличная документация, также есть реальная глава Haskell.
QuickCheck : очень крутая программа тестирования. Что вы делаете, это пишите предикат, который всегда должен быть истинным (например length (reverse lst) == length lst
). Затем вы передаете предикат QuickCheck, и он сгенерирует много случайных значений (в данном случае списков) и проверит, что предикат верен для всех результатов. Смотрите также онлайн-руководство .
HUnit : модульное тестирование в Haskell.
gtk2hs : самый популярный графический интерфейс для Haskell, позволяет писать приложения на gtk на Haskell.
happstack : фреймворк для веб-разработки на 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 (и все его особенности)
- cabal : система пакетов Haskell
- darcs : распределенная система контроля версий, написанная на Haskell, очень популярная для программ на Haskell.
- пикша : генератор документации Haskell
Изучая все эти новые библиотеки и концепции, очень полезно написать проект небольшого размера на Haskell. Это может быть что угодно (например, небольшая игра, анализатор данных, веб-сайт, компилятор ). Работая над этим, вы сможете применить многие вещи, которые вы сейчас изучаете. Вы остаетесь на этом уровне целую вечность (это то, где я нахожусь).
эксперт
Вам понадобятся годы, чтобы добраться до этой стадии (привет с 2009 года!), Но отсюда я предполагаю, что вы начнете писать статьи на phd, новые расширения ghc и придумывать новые абстракции.
Получать помощь
Наконец, на любом этапе обучения есть несколько мест для получения информации. Эти:
- канал #haskell irc
- в списки рассылки . На них стоит подписаться, чтобы просто прочитать проходящие обсуждения - некоторые из них очень интересные.
- другие места, перечисленные на домашней странице haskell.org
Вывод
Ну, это оказалось дольше, чем я ожидал ... Во всяком случае, я думаю, что это очень хорошая идея, чтобы стать опытным в Хаскеле. Это занимает много времени, но это в основном потому, что таким образом вы учитесь совершенно новому образу мышления. Это не то же самое, что изучение Ruby после изучения Java, но и изучение Java после изучения C. Кроме того, я обнаружил, что мои навыки объектно-ориентированного программирования улучшились в результате изучения Haskell, поскольку я вижу много новых способов абстрагирования идей.