Ответ 1
Я собираюсь заказать это руководство по уровню мастерства, которым вы обладаете в Хаскеле, от абсолютного новичка до эксперта. Обратите внимание, что этот процесс займет много месяцев (лет?), Поэтому он довольно долгий.
Абсолютный новичок
Во-первых, Haskell способен на все, с достаточным умением. Он очень быстрый (за моим опытом только C и C++) и может использоваться для любых целей, от моделирования до серверов, графических приложений и веб-приложений.
Однако есть некоторые проблемы, которые легче написать новичку в Haskell, чем другие. Математические задачи и программы обработки списков являются хорошими кандидатами для этого, так как для их написания требуются только самые базовые знания Haskell.
Во - первых, некоторые хорошие руководства по обучению самые основы Haskell являются счастливыми узнать Haskell учебник и первые 6 глав узнать вам Haskell. Читая их, очень хорошая идея также решать простые проблемы с тем, что вы знаете.
Еще два полезных ресурса - это программирование на Haskell с первых принципов и программирование на Haskell. Они оба поставляются с упражнениями для каждой главы, поэтому у вас есть небольшие простые проблемы, соответствующие тому, что вы узнали на последних нескольких страницах.
Хороший список проблем, которые нужно попробовать, это страница проблем на haskell 99. Они начинаются очень просто и становятся сложнее. Это очень хорошая практика, так как они позволяют вам практиковаться в рекурсии и функциях более высокого порядка. Я бы порекомендовал пропустить любые проблемы, требующие случайности, поскольку это немного сложнее в Haskell. Проверьте этот вопрос на тот случай, если вы хотите протестировать свои решения с помощью QuickCheck (см. Раздел ниже).
После того, как вы сделали несколько из них, вы можете перейти к решению некоторых проблем Project Euler. Они отсортированы по тому, сколько человек их выполнили, что является довольно хорошим показателем сложности. Они проверяют вашу логику и Haskell больше, чем предыдущие проблемы, но вы все равно сможете сделать первые несколько. Большое преимущество, которое Haskell имеет с этими проблемами, состоит в том, что целые числа не ограничены в размере. Чтобы решить некоторые из этих проблем, будет полезно прочитать главы 7 и 8, а также узнать о Хаскеле.
начинающий
После этого у вас должны быть достаточно хорошие навыки работы с рекурсией и функциями более высокого порядка, так что сейчас самое время приступить к решению некоторых более реальных проблем. Очень хорошее место для начала - Real World Haskell (онлайн-книга, вы также можете приобрести печатную версию). Я обнаружил, что первые несколько глав слишком быстро вводятся слишком быстро для тех, кто никогда раньше не занимался функциональным программированием и не использовал рекурсию. Однако с практикой, которую вы имели бы от решения предыдущих задач, вы должны найти это совершенно понятным.
Работа с проблемами в книге - отличный способ научиться управлять абстракциями и создавать повторно используемые компоненты в Haskell. Это жизненно важно для людей, привыкших к объектно-ориентированному (оо) программированию, поскольку обычные методы абстракции оо (классы оо) не появляются в Хаскеле (у Хаскеля есть классы типов, но они сильно отличаются от классов оо, больше похожи на интерфейсы оо).). Я не думаю, что это хорошая идея, чтобы пропустить главы, поскольку каждая из них вводит много новых идей, которые используются в последующих главах.
Через некоторое время вы попадете в главу 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: для разбора программ и текста. Гораздо лучше, чем с помощью регулярных выражений. Отличная документация, также есть в реальной жизни глава Haskell.
-
QuickCheck: очень крутая программа тестирования. Что вы делаете, это пишите предикат, который всегда должен быть истинным (например,
length (reverse lst) == length lst
). Затем вы передаете предикат QuickCheck, и он сгенерирует много случайных значений (в данном случае списков) и проверит, что предикат верен для всех результатов. Смотрите также онлайн-руководство. -
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
Изучая все эти новые библиотеки и концепции, очень полезно написать проект небольшого размера на Хаскелле. Это может быть что угодно (например, небольшая игра, анализатор данных, веб-сайт, компилятор). Работа над этим позволит вам применить многие вещи, которые вы сейчас изучаете. Вы остаетесь на этом уровне целую вечность (это то, где я нахожусь).
эксперт
Вам понадобятся годы, чтобы добраться до этой стадии (привет с 2009 года!), Но отсюда, я полагаю, вы начнете писать статьи PhD, новые расширения GHC и придумывать новые абстракции.
Получать помощь
Наконец, на любом этапе обучения есть несколько мест для получения информации. Это:
- канал #haskell irc
- списки рассылки. На них стоит подписаться, чтобы просто прочитать проходящие обсуждения - некоторые из них очень интересные.
- другие места, перечисленные на домашней странице haskell.org
Заключение
Ну, это оказалось дольше, чем я ожидал... Во всяком случае, я думаю, это очень хорошая идея, чтобы стать опытным в Хаскеле. Это занимает много времени, но это в основном потому, что таким образом вы учитесь совершенно новому образу мышления. Это не то же самое, что изучение Ruby после изучения Java, но и изучение Java после изучения C. Кроме того, я обнаружил, что мои навыки объектно-ориентированного программирования улучшились в результате изучения Haskell, поскольку я вижу много новых способов абстрагирования идей.