начало работы с haskell

<p>в течение нескольких дней я пытался обернуть голову вокруг парадигмы функционального программирования в haskell. я сделал это, читая учебные пособия и просматривая скринкасты, но, похоже, ничего не изменилось. теперь, при изучении различных императивных/oo-языков (таких как c, java, php), упражнения стали для меня хорошим способом. но поскольку я действительно не знаю, на что способен haskell, и поскольку есть много новых концепций, которые я могу использовать, я не знаю, с чего начать.</p><p>итак, как ты выучил haskell? что заставило вас действительно "сломать лед"? кроме того, есть хорошие идеи для начала упражнений?</p>

<p>я собираюсь заказать это руководство по уровню мастерства, которым вы обладаете в хаскеле, от абсолютного новичка до эксперта. обратите внимание, что этот процесс займет много месяцев (лет?), поэтому он довольно долгий.</p><p><strong> абсолютный новичок </strong></p><p>во-первых, haskell способен на все, с достаточным умением. он очень быстрый (за моим опытом только c и c++) и может использоваться для любых целей, от моделирования до серверов, графических приложений и веб-приложений.</p><p>однако есть некоторые проблемы, которые легче написать новичку в haskell, чем другие. математические задачи и программы обработки списков являются хорошими кандидатами для этого, так как для их написания требуются только самые базовые знания haskell.</p><p>во-первых, несколько хороших руководств по изучению основ языка haskell - это <a href="http://www.happylearnhaskelltutorial.com">счастливый урок по haskell</a> и первые 6 глав <a href="http://learnyouahaskell.com/chapters">выучите хаскель</a> . читая их, очень полезно также решать простые проблемы с тем, что вы знаете.</p><p>еще два полезных ресурса: <a href="http://haskellbook.com/">программирование на haskell из первых принципов</a> и <a href="http://www.cs.nott.ac.uk/~pszgmh/pih.html">программирование на haskell</a> . они оба поставляются с упражнениями для каждой главы, поэтому у вас есть небольшие простые проблемы, соответствующие тому, что вы узнали на последних нескольких страницах.</p><p>хороший список проблем - <a href="http://haskell.org/haskellwiki/h-99:\_ninety-nine\_haskell\_problems">страница проблем haskell 99</a> . они начинаются очень просто и становятся сложнее по мере продвижения. это очень хорошая практика, поскольку они позволяют вам практиковать свои навыки в рекурсии и функциях более высокого порядка. я бы порекомендовал пропустить любые проблемы, требующие случайности, поскольку это немного сложнее в haskell. отметьте <a href="https://stackoverflow.com/questions/5683911/simple-haskell-unit-testing">это so вопрос</a> , если вы хотите протестировать свои решения с помощью quickcheck (см. <em> промежуточное звено </em> ниже).</p><p>после того, как вы выполнили несколько из них, вы можете перейти к решению нескольких проблем <a href="http://projecteuler.net/index.php?section=problems">project euler</a> . они отсортированы по тому, сколько человек их выполнили, что является довольно хорошим показателем сложности. они проверяют вашу логику и haskell больше, чем предыдущие проблемы, но вы все равно сможете сделать первые несколько. большое преимущество, которое haskell имеет с этими проблемами, состоит в том, что целые числа не ограничены в размере. чтобы решить некоторые из этих проблем, будет полезно прочитать главы 7 и 8, а также узнать о хаскеле.</p><p><strong> начинающий </strong></p><p>после этого у вас должны быть достаточно хорошие навыки работы с рекурсией и функциями более высокого порядка, так что сейчас самое время приступить к решению некоторых более реальных проблем. очень хорошее место для начала --- <a href="http://book.realworldhaskell.org/">real world haskell</a> (онлайн-книга, вы также можете приобрести печатную версию). я обнаружил, что первые несколько глав слишком быстро вводятся слишком быстро для тех, кто никогда раньше не занимался функциональным программированием и не использовал рекурсию. однако с практикой, которую вы имели бы при выполнении предыдущих задач, вы должны найти это совершенно понятным.</p><p>работа с проблемами в книге - отличный способ научиться управлять абстракциями и создавать компоненты многократного использования в haskell. это жизненно важно для людей, привыкших к объектно-ориентированному (оо) программированию, поскольку обычные методы абстракции оо (классы оо) не отображаются в хаскеле (в хаскеле есть классы типов, но они очень отличаются от классов оо, больше похожи на интерфейсы оо). ). я не думаю, что это хорошая идея, чтобы пропустить главы, так как каждая вводит много новых идей, которые используются в последующих главах.</p><p>через некоторое время вы попадете в главу 14, главу страшных монад (dum dum dummmm). почти каждый, кто изучает хаскель, испытывает затруднения в понимании монад, из-за того, насколько абстрактна эта концепция. я не могу представить ни одного понятия на другом языке, столь же абстрактного, как монады в функциональном программировании. monads позволяет объединять многие идеи (такие как операции io, вычисления, которые могут быть неудачными, синтаксический анализ, ...) в рамках одной идеи. так что не расстраивайтесь, если после прочтения главы о монадах вы на самом деле их не понимаете. я нашел полезным прочитать много разных объяснений монад; каждый дает новый взгляд на проблему. вот очень хороший <a href="https://wiki.haskell.org/tutorials#using\_monads">список учебных пособий по монадам</a> . я настоятельно рекомендую <a href="https://wiki.haskell.org/all\_about\_monads">all about monads</a> , но другие тоже хороши.</p><p>кроме того, требуется некоторое время, чтобы концепции действительно проникли внутрь. это приходит через использование, но также и через время. я обнаружил, что иногда сон на проблему помогает больше, чем что-либо еще! в конце концов, идея сработает, и вы удивитесь, почему вы пытались понять концепцию, которая на самом деле невероятно проста. это замечательно, когда это происходит, и когда это происходит, вы можете найти haskell своим любимым языком императивного программирования :)</p><p>чтобы убедиться, что вы хорошо понимаете систему типов haskell, вы должны попытаться решить <a href="http://blog.tmorris.net/posts/20-intermediate-haskell-exercises/">20 промежуточных упражнений на haskell</a> . в этих упражнениях используются забавные названия функций, таких как "пушистый" и "банановый", и они помогут вам лучше понять некоторые основные концепции функционального программирования, если у вас их еще нет. хороший способ провести вечер с кучей бумаг, покрытых стрелами, единорогами, сосисками и пушистыми бананами.</p><p><strong> промежуточное соединение </strong></p><p>как только вы поймете monads, я думаю, что вы перешли от начинающего программиста на haskell к промежуточному хаскеллеру. так куда же идти? первое, что я бы порекомендовал (если вы еще не изучили их из изучения монад), это различные типы монад, такие как reader, writer и state. опять же, реальный мир на haskell и all about monads дает отличную информацию об этом. для завершения обучения монаде изучение монадных трансформаторов является обязательным. это позволяет вам объединять разные типы монад (например, читатель и монаду состояния) в одну. это может показаться бесполезным с самого начала, но после некоторого использования вы будете удивляться, как вы жили без них.</p><p>теперь вы можете закончить книгу на хаскеле в реальном мире, если хотите. пропуск глав теперь не имеет особого значения, пока у вас нет монад. просто выберите то, что вас интересует.</p><p>обладая знаниями, которыми вы обладаете сейчас, вы сможете использовать большинство пакетов на cabal (по крайней мере, хорошо документированных), а также большинство библиотек, поставляемых с haskell. список интересных библиотек, которые можно попробовать:</p><ul> <li> <p> <a href="https://wiki.haskell.org/parsec">parsec</a> : для анализа программ и текста. гораздо лучше, чем с помощью регулярных выражений. отличная документация, также есть в реальной жизни глава haskell.</p> </li> <li> <p> <a href="http://www.cse.chalmers.se/~rjmh/quickcheck/">quickcheck</a> : очень крутая программа тестирования. что вы делаете, это пишите предикат, который всегда должен быть истинным (например, <code>length (reverse lst) == length lst</code>). затем вы передаете предикат quickcheck, и он сгенерирует много случайных значений (в данном случае списков) и проверит, что предикат верен для всех результатов. смотрите также <a href="http://www.cse.chalmers.se/~rjmh/quickcheck/manual.html">онлайн-руководство</a> .</p> </li> <li> <p> <a href="http://hunit.sourceforge.net/">hunit</a> : модульное тестирование в haskell.</p> </li> <li> <p> <a href="http://projects.haskell.org/gtk2hs/">gtk2hs</a> : самый популярный графический интерфейс для haskell, позволяет писать приложения на gtk на haskell.</p> </li> <li> <p> <a href="http://happstack.com/">happstack</a> : фреймворк веб-разработки для haskell. не использует базы данных, вместо этого хранилище типов данных. довольно хорошие документы (другие популярные фреймворки были бы <a href="http://snapframework.com/">snap</a> и <a href="http://www.yesodweb.com/">yesod</a> ).</p> </li> </ul><p>кроме того, есть много концепций (например, концепция монады), которые вы должны в конечном итоге выучить. это будет легче, чем изучать монады в первый раз, так как ваш мозг привыкнет справляться с уровнем абстракции. очень хороший обзор для изучения этих концепций высокого уровня и того, как они сочетаются друг с другом, - <a href="http://www.haskell.org/haskellwiki/typeclassopedia">typeclassopedia</a> .</p><ul> <li> <p>аппликативный: интерфейс, похожий на monads, но менее мощный. каждая монада аппликативна, но не наоборот. это полезно, поскольку есть некоторые типы, которые являются аппликативными, но не являются монадами. кроме того, код, написанный с использованием функций applicative, часто более удобен для компоновки, чем написание эквивалентного кода с использованием функций monad. см. <a href="http://learnyouahaskell.com/functors-applicative-functors-and-monoids#functors-redux">функторы, аппликативные функторы и моноиды</a> в руководстве по изучению языка haskell.</p> </li> <li> <p> <a href="http://www.haskell.org/ghc/docs/latest/html/libraries/base/data-foldable.html">foldable</a> , <a href="http://www.haskell.org/ghc/docs/latest/html/libraries/base/data-traversable.html">traversable</a> : классы типов, которые абстрагируют многие операции от списков, так что те же функции могут быть применены к другим типам контейнеров. смотрите также <a href="https://wiki.haskell.org/foldable\_and\_traversable">объяснение вики на haskell</a> .</p> </li> <li> <p> <a href="https://wiki.haskell.org/monoid">monoid</a> : monoid - это тип, имеющий нулевое (или незначительное) значение, и операция, обозначаемая <code><></code>, которая объединяет два моноида, так что <code>x <> mempty = mempty <> x = x</code> и <code>x <> (y <> z) = (x <> y) <> z</code>. это так называемые законы идентичности и ассоциативности. многие типы являются моноидами, например числами, с <code>mempty = 0</code> и <code><> = +</code>. это полезно во многих ситуациях.</p> </li> <li> <p> <a href="http://www.haskell.org/arrows/">стрелки</a> : стрелки представляют собой способ представления вычислений, которые принимают входные данные и возвращают выходные данные. функция - это самый простой тип стрелки, но есть много других типов. в библиотеке также есть много очень полезных функций для манипулирования стрелками - они очень полезны, даже если они используются только с простыми старыми функциями haskell.</p> </li> <li> <p> <a href="https://wiki.haskell.org/modern\_array\_libraries">arrays</a> : различные изменяемые/неизменяемые массивы в haskell.</p> </li> <li> <p> <a href="https://wiki.haskell.org/monad/st">st monad</a> : позволяет писать код с изменяемым состоянием, которое выполняется очень быстро, но при этом остается чистым вне монады. пройдите по ссылке, чтобы узнать больше.</p> </li> <li> <p>frp: функциональное реактивное программирование, новый экспериментальный способ написания кода, который обрабатывает события, триггеры, входы и выходы (например, графический интерфейс). я не знаю много об этом, хотя <a href="http://vimeo.com/96744621">разговор пола худака о ямпе</a> это хорошее начало.</p> </li> </ul><p>есть много новых языковых возможностей, на которые стоит обратить внимание. я просто перечислю их, вы можете найти много информации о них из google, <a href="http://en.wikibooks.org/wiki/haskell">haskell wikibook</a> , сайта haskellwiki.org и <a href="https://wiki.haskell.org/ghc">ghc документация</a> .</p><ul> <li>классы многопараметрического типа/функциональные зависимости</li> <li>тип семьи</li> <li>экзистенциально количественные типы</li> <li>фантомные типы</li> <li>gadts</li> <li>другие ...</li> </ul><p>многое из haskell основано на <a href="http://en.wikipedia.org/wiki/category\_theory">теория категорий</a> , так что вы можете посмотреть на это. хорошей отправной точкой является <a href="https://rads.stackoverflow.com/amzn/click/com/0262660717">теория категорий для учёного-компьютерщика</a> . если вы не хотите покупать книгу, авторский текст <a href="http://repository.cmu.edu/cgi/viewcontent.cgi?article=2846&context=compsci">статья</a> также превосходен.</p><p>наконец, вы захотите узнать больше о различных инструментах haskell. они включают:</p><ul> <li> <a href="https://wiki.haskell.org/ghc">ghc</a> (и все его функции)</li> <li> <a href="http://www.haskell.org/cabal/">cabal</a> : система пакетов haskell</li> <li> <a href="http://darcs.net/">darcs</a> : распределенная система контроля версий, написанная на haskell, очень популярная для программ на haskell.</li> <li> <a href="http://www.haskell.org/haddock/">пикша</a> : автоматический генератор документации на haskell</li> </ul><p>изучая все эти новые библиотеки и концепции, очень полезно написать проект небольшого размера на haskell. это может быть что угодно (например, небольшая игра, анализатор данных, веб-сайт, <a href="http://en.wikibooks.org/wiki/write\_yourself\_a\_scheme\_in\_48\_hours">компилятор</a> ). работа над этим позволит вам применить многие вещи, которые вы сейчас изучаете. вы остаетесь на этом уровне целую вечность (это то, где я нахожусь).</p><p><strong> эксперт </strong></p><p>вам понадобятся годы, чтобы добраться до этой стадии (привет с 2009 года!), но отсюда я предполагаю, что вы начнете писать статьи на phd, новые расширения ghc и придумывать новые абстракции.</p><p><strong> получение справки </strong></p><p>наконец, на любом этапе обучения есть несколько мест для получения информации. это:</p><ul> <li>канал #haskell irc</li> <li> <a href="https://wiki.haskell.org/mailing\_lists">списки рассылки</a> . на них стоит подписаться, чтобы просто прочитать проходящие обсуждения - некоторые из них очень интересные.</li> <li>другие места, перечисленные на домашней странице haskell.org</li> </ul><p><strong> заключение </strong></p><p>ну, это оказалось дольше, чем я ожидал ... во всяком случае, я думаю, это очень хорошая идея, чтобы стать опытным в хаскеле. это занимает много времени, но это в основном потому, что таким образом вы учитесь совершенно новому образу мышления. это не похоже на изучение ruby после изучения java, но похоже на изучение java после изучения c. кроме того, я обнаружил, что мои навыки объектно-ориентированного программирования улучшились в результате изучения haskell я вижу много новых способов абстрагирования идей.</p>

<p>у одного моего коллеги был хороший опыт работы с <a href="http://learnyouahaskell.com/">учим тебя хаскеллу за великое добро!</a> .</p><blockquote> <p>учебное пособие предназначено для людей, которые имеют опыт работы с императивными языками программирования, но ранее не программировали на функциональном языке.</p> </blockquote><p>и проверьте ответы <a href="https://stackoverflow.com/questions/16918/beginners-guide-to-haskell">здесь</a> тоже</p>

<p>вот хорошая книга, которую вы можете прочитать онлайн: <a href="http://book.realworldhaskell.org/">real world haskell</a> </p><p>большинство программ на haskell, которые я сделал, предназначались для решения <a href="http://projecteuler.net/">project euler</a> проблем.</p><p>однажды совет, который я прочитал не так давно, заключался в том, что у вас должен быть стандартный набор простых задач, которые вы знаете, как решать (теоретически), и затем всякий раз, когда вы пытаетесь выучить новый язык, вы реализуете эти проблемы на этом языке.</p>

<p>мне понравилось смотреть эту серию из 13 серий о функциональном программировании с использованием haskell.</p><p>c9 лекции: д-р эрик мейер - основы функционального программирования: <a href="http://channel9.msdn.com/shows/going+deep/lecture-series-erik-meijer-functional-programming-fundamentals-chapter-1/">http://channel9.msdn.com/shows/going+deep/lecture-series-erik-meijer-functional-programming-fundamentals-chapter-1/</a> </p>

<p>чтобы добавить ответы других - есть одна полезная, которая поможет вам при кодировании (например, при решении задач проекта эйлера): <strong> hoogle </strong>. вы можете использовать либо интерфейс командной строки, либо <a href="http://www.haskell.org/hoogle/">веб-интерфейс</a> .</p><h2>командная строка</h2><p>после того, как вы установили платформу haskell, убедитесь, что <code>cabal install hoogle</code></p><p>пример использования google:</p><p>у вас есть функция <code>f x = 3 * x + 1</code>, и вы хотите применить ее к <code>(5 :: int)</code>, затем применить ее к результату и к этому результату и т.д. и получить бесконечный список этих значений. вы подозреваете, что, возможно, уже существует функция, которая может помочь вам (хотя не специально для вашего <code>f</code>).</p><p>эта функция будет иметь тип <code>(a -> a) -> a -> [a]</code>, если она принимает <code>f 5</code> или <code>a -> (a -> a) -> [a]</code>, если она принимает <code>5 f</code> (мы предполагаем, что функция предназначена для общих типов, а не только <code>int</code>s)</p><pre><code>$ hoogle "a -> (a -> a) -> [a]" prelude iterate :: (a -> a) -> a -> [a] </code></pre><p>да, нужная вам функция уже существует и называется <code>iterate</code>. вы используете его <code>iterate func 5</code>!</p><h2>веб интерфейс</h2><p>результат для того же примера можно найти <a href="http://www.haskell.org/hoogle/?hoogle=a%20-%3e%20(a%20-%3e%20a)%20-%3e%20%5ba%5d">здесь</a> .</p>

<p>программирование грэма хаттона <a href="http://www.cs.nott.ac.uk/~gmh/book.html">в haskell</a> является лаконичным, достаточно тщательным, и его годы преподавания haskell действительно показывают. это почти всегда то, с чего я рекомендую людям начать, независимо от того, куда вы идете оттуда.</p><p>в частности, глава 8 ("функциональные парсеры") предоставляет реальную основу, необходимую для начала работы с монадами, и я думаю, что это лучшее место для начала, за которым следует <a href="http://www.haskell.org/haskellwiki/all\_about\_monads">all about monads</a> . (тем не менее, что касается этой главы, обратите внимание на ошибки на веб-сайте: вы не можете использовать форму <code>do</code> без специальной помощи. возможно, вы захотите сначала изучить классы типов и решить эту проблему самостоятельно.)</p><p>начинающим на haskell это редко подчеркивается, но стоит довольно рано изучить не только использование монад, но и конструирование своих собственных. это не сложно, а индивидуальные могут сделать ряд задач более простым.</p>

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

<p>я бы предложил присоединиться к <a href="http://www.haskell.org/haskellwiki/irc"># канал haskell irc</a> и задавать там вопросы. вот так я и выучил хаскелл. если вы пройдете через real world haskell, как предложено выше, ответы на ваши вопросы в режиме реального времени очень помогут. многие умные люди на #haskell пишут на haskell для удовольствия и для получения прибыли, так что вы получите много хорошего вклада. попытайся!</p>

<p><strong> это мои любимые </strong></p><p><strong> <a href="http://upload.wikimedia.org/wikipedia/commons/2/26/haskell.pdf">haskell: функциональное программирование с типами</a> </strong></p><pre><code>joeri van eekelen, et al. | wikibooks published in 2012, 597 pages </code></pre><p><strong> <a href="http://book.realworldhaskell.org/read/">real world haskell</a> </strong></p><pre><code> b. o'sullivan, j. goerzen, d. stewart | oreilly media, inc. published in 2008, 710 pages </code></pre>

<p>я могу дополнительно порекомендовать <a href="http://www.cs.utah.edu/~hal/docs/daume02yaht.pdf"><em> еще одно руководство по haskell </em></a> в качестве введения.</p><p>еще один хороший учебный ресурс (вероятно, на промежуточном уровне), который мне очень помог и, насколько я могу судить, не был упомянут в других ответах, - это типовая классификация брента йорги <em> </em>, который можно найти в <a href="http://www.haskell.org/sitewiki/images/8/85/tmr-issue13.pdf"><em> the monad reader </em> (выпуск 13)</a> </p><p>он написан в очень доступном стиле и содержит (среди прочего) следующие вводные советы:</p><blockquote> <p>есть два ключа к мудрости хакерского эксперта haskell:</p> <ol> <li> <p>понять типы.</p> </li> <li> <p>получите глубокую интуицию для каждого класса типов и его связь с другими классами типов, подкрепленную знакомством со многими примерами.</p> </li> </ol> </blockquote><p> <a href="http://themonadreader.wordpress.com/"><em> monad reader </em></a> сам по себе является абсолютной сокровищницей для функциональных программистов (не только программистов на haskell).</p>

<p>я действительно думаю, что реализация возможностей haskell на примерах - лучший способ начать прежде всего.</p><p> <a href="http://en.wikipedia.org/wiki/haskell\_98\_features">http://en.wikipedia.org/wiki/haskell\_98\_features</a> </p><p>вот хитрые типы классов, включая монады и стрелки</p><p> <a href="http://www.haskell.org/haskellwiki/typeclassopedia">http://www.haskell.org/haskellwiki/typeclassopedia</a> </p><p>для реальных задач и больших проектов запомните эти теги: ghc (наиболее часто используемый компилятор), hackage (librarydb), cabal (система сборки), darcs (еще одна система сборки).</p><p>интегрированная система может сэкономить ваше время: <a href="http://hackage.haskell.org/platform/">http://hackage.haskell.org/platform/</a> </p><p>база данных пакетов для этой системы: <a href="http://hackage.haskell.org/">http://hackage.haskell.org/</a> </p><p>вики компилятора ghc: <a href="http://www.haskell.org/haskellwiki/ghc">http://www.haskell.org/haskellwiki/ghc</a> </p><p>после haskell\_98\_features и typeclassopedia, я думаю, вы уже можете найти и прочитать документацию о них сами</p><p>кстати, вы можете протестировать расширение некоторых языков ghc, которое в будущем может стать частью стандарта haskell.</p><p>это мой лучший способ изучения хаскелла. я надеюсь, что это может помочь вам.</p>

<p>попробуйте написать в нем простые программы.</p><p>вы можете найти примеры задач в различных учебниках, вероятно.</p><p>я бы не рекомендовал придерживаться учебников по haskell/fp, просто попытайтесь сделать с ним простые вещи: вычисления, манипуляции со строками, доступ к файлам.</p><p>после того, как я решил дюжину, я сломал лед :)</p><p>после этого прочитайте много о продвинутых концепциях (monads, arrows, io, рекурсивные структуры данных), потому что haskell бесконечен и их много.</p>

<p>я предлагаю вам сначала начать с чтения <a href="http://www.learnyouahaskell.com">учебник bonus</a> , а затем читать <a href="http://book.realworldhaskell.org/read/">real world haskell (онлайн бесплатно)</a> . присоединяйтесь к каналу <a href="http://www.haskell.org/haskellwiki/irc"># haskell irc, irc.freenode.com</a> и задавайте вопросы. эти люди абсолютно новички дружелюбны, и со временем мне очень помогли. кроме того, здесь, в so, можно получить помощь по вещам, которые вы не можете понять! старайтесь не унывать, как только он щелкнет, ваш ум будет взорван.</p><p>учебное пособие bonus поднимет вам настроение и подготовит вас к захватывающей поездке, которую приносит real world haskell. желаю тебе удачи!</p>

<p>если у вас есть только опыт работы с императивными/oo-языками, я предлагаю использовать более традиционный функциональный язык в качестве основы. haskell <em>на самом деле</em> отличается, и вам нужно понять много разных концепций, чтобы добраться куда угодно. я предлагаю сначала заняться языком в стиле ml (например, f #).</p>

<p>первый ответ очень хороший. для того, чтобы попасть на уровень эксперта, вы должны получить докторскую степень с некоторыми из экспертов.</p><p>я предлагаю вам посетить страницу на haskell: <a href="http://haskell.org">http://haskell.org</a> . там у вас есть много материала и множество ссылок на самые современные материалы в haskell, одобренные сообществом haskell.</p>