it-swarm.com.ru

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

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

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

756
anderstornvig

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

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

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

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

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

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

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

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

Начинающий

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

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

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

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

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

Промежуточное соединение

Как только вы поймете Monads, я думаю, что вы перешли от начинающего программиста на Haskell к промежуточному хаскеллеру. Так куда же идти? Первое, что я бы порекомендовал (если вы еще не изучили их из изучения монад), это различные типы монад, такие как 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. Не использует базы данных, вместо этого хранилище типов данных. Довольно хорошие документы (другие популярные фреймворки были бы snap и yesod ).

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

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

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

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

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

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

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

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

Есть много новых языковых возможностей, на которые стоит обратить внимание. Я просто перечислю их, вы можете найти много информации о них из google, haskell wikibook , сайта 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 Я вижу много новых способов абстрагирования идей.

2410
David Miani

У одного моего коллеги был хороший опыт работы с Учим тебя Хаскеллу за великое добро! .

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

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

175
jitter

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

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

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

101
David Johnstone

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

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

71
eevar

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

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

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

69
yairchu

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

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

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

56
Curt J. Sampson

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

51
John Smith

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

31
shapr

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

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

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

Real World Haskell

   B. O'Sullivan, J. Goerzen, D. Stewart | OReilly Media, Inc.
   Published in 2008, 710 pages
24
Soner Gönül

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

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

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

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

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

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

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

19
Greg S

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

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

14
snow

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

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

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

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

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

14
alamar

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

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

13
Rayne

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

12
JacquesB

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

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

10
user354231