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

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

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

Ответ 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, и он сгенерирует много случайных значений (в данном случае списков) и проверит, что предикат верен для всех результатов. Смотрите также онлайн-руководство.

  • 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

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

эксперт

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

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

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

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

Заключение

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 5

Чтобы добавить ответы других - есть одно полезное, которое поможет вам при кодировании (например, при решении проблем проекта Эйлера): 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 (мы предполагаем, что функция предназначена для общих типов, а не только Int s)

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 10

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

Еще один хороший учебный ресурс (возможно, на промежуточном уровне), который мне очень помог и не упоминался в других ответах, насколько я могу судить, - это Brent Yorgey Typeclassopedia, который можно найти в The Monad Reader (выпуск 13)

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

Есть два ключа к эксперту хакеллских хакеров:

  • Понимать типы.

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

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

Ответ 11

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

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

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

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

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

Ответ 12

Я действительно думаю, что реализация 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/

GKC-компилятор wiki: http://www.haskell.org/haskellwiki/GHC

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

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

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

Ответ 13

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

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

Ответ 14

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

Ответ 15

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

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