уроки - learn yourself some haskell




Начало работы с Haskell (10)

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

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

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

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

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


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


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


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

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


У моего коллеги был хороший опыт работы с Learn Haskell для Great Good! ,

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

И проверьте ответы here тоже


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

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

После установки платформы Haskell убедитесь, что вы cabal install hoogle

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

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

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

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


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

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

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

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 в будущем.

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


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

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

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

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

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

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

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


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

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

Во-первых, haskell способен на что угодно, с достаточным навыком. Это очень быстро (за исключением только c и c ++ в моем опыте) и может использоваться для чего угодно: от моделирования до серверов, guis и веб-приложений.

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

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

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

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

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

начинающий

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

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

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

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

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

промежуточный

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

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

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

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

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

  • HUnit : Тестирование модулей в haskell.

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

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

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

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

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

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

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

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

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

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

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

  • Многопараметрические классы классов / функциональные зависимости
  • Типы семей
  • Экзистенциально квантованные типы
  • Типы фантомов
  • GADTS
  • другие ...

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

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

  • ghc (и все его функции)
  • cabal : система упаковки haskell
  • darcs : система управления распределенной версией, написанная в haskell, очень популярная для программ haskell.
  • haddock : генератор автоматической документации haskell

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

эксперт

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

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

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

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

Заключение

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


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

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

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







functional-programming