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

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

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

15 ответов


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

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

во-первых, Хаскелл способен на все, с достаточным мастерством. Это очень быстро (только за c и C++ в моем опыте), и может использоваться для чего-либо от моделирования до серверов, guis и web приложения.

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

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

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

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

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

Новичок

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

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

список монад учебники. Я настоятельно рекомендую Все О Монадах, но другие тоже хороши.

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

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

средний

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

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

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

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

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

  • H единичных: модульное тестирование в haskell.

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

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

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

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

  • складная конструкция,проходимым: Typeclasses, которые абстрагируют многие операции списков, так что те же функции могут быть применены к другим типам контейнеров. См. также Haskell wiki explaination.

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

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

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

  • святая Монада: позволяет писать код с изменяемым состоянием, которое работает очень быстро, оставаясь при этом чистым вне монады. См. ссылку для получения более подробной информации.

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

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

  • классы многопараметрических типов / функциональные зависимости
  • семей типа
  • экзистенциально количественно типов
  • Фантом типа
  • ГАДЦ
  • другие...

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

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

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

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

эксперт

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

Справка

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

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

вывод

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


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

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

и проверь ответы здесь слишком


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

большинство программ Haskell, которые я сделал, были решить Проект Эйлера проблемы.

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


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

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


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

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

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

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

у вас есть функция 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!

web-интерфейс

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


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

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

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


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


Я бы предложил присоединиться к #Хаскелл IRC-канал и задавать там вопросы. Так я узнал Хаскелла. Если вы пройдете через реальный мир 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 в качестве введения.

другим хорошим учебным ресурсом (вероятно, на промежуточном уровне), который мне очень помог и, насколько я вижу, не упоминается в других ответах, является Brent Yorgey's Typeclassopedia, который можно найти в Читатель Монады (выпуск 13)

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

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

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

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

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


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

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

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

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

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


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

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

вот сложные typeclasses, включая монады и стрелки

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

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

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

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

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

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

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

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


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

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


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


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

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