Подтвердить что ты не робот

Какой следующий шаг к изучению Хаскелла после монад?

Я постепенно изучал Хаскелл и даже чувствую, что у меня есть мозаика. Тем не менее, еще много экзотических вещей, которые я почти не понимаю, например, Arrows, Applicative и т.д. Хотя я собираю кусочки из кода Haskell, которые я видел, было бы неплохо найти учебник, который действительно объясняет их полностью. (Кажется, что на монадах есть десятки уроков.. но все, кажется, заканчивается прямо после этого!)

4b9b3361

Ответ 1

Вот несколько из ресурсов, которые я нашел полезными после "получения зависания" монадов:

  • Как отметил SuperBloup, Brent Yorgey Typeclassopedia является незаменимым (и на самом деле он накрывает стрелки).
  • Там много отличных вещей в Real World Haskell, которые можно было бы считать "после монад": аппликативный синтаксический анализ, монадные трансформаторы и STM, например.
  • Джон Хьюз "Обобщение Монад в стрелки" - отличный ресурс, который учил меня как о монадах, так и о стрелках (хотя я подумал, что я уже понял монады, когда читал).
  • "Ямпа Аркада" - хорошее введение в функциональное реактивное программирование.
  • В типах семействах: я нашел работу с ними проще, чем чтение о них. Пакет vector-space - это одно место для начала, или вы можете посмотреть код от Олега Киселева и Кен Шаня курс по семантике Haskell и естественного языка.
  • Выберите пару глав Криса Окасаки Чисто функциональные структуры данных и подробно рассмотрите их.
  • Raymond Smullyan Чтобы искупить пересмешник - это фантастически доступное введение в комбинаторную логику, которая изменит способ написания Haskell.
  • Прочтите Gérard Huet Функциональная жемчужина на молниях. Код OCaml, но он полезен (и не слишком сложно), чтобы иметь возможность переводить OCaml в Haskell в вашей голове при работе с такими документами.

Самое главное, вникните в код любых библиотек Hackage, которые вы используете. Если они делают что-то с синтаксисом или идиомами или расширениями, которые вы не понимаете, посмотрите его.

Ответ 2

Что касается классов классов:

  • Applicative на самом деле проще, чем Monad. Я недавно сказал несколько вещей об этом в другом месте, но суть в том, что он улучшил Functor, что вы можете поднять функции. Чтобы получить представление о Applicative, вы можете попробовать написать что-то, используя Parsec без использования обозначения do - мой опыт был что аппликативный стиль работает лучше, чем монадический для простых парсеров.

  • Arrow - очень абстрактный способ работы с вещами вроде своего рода ( "стрелки" между типами). Им может быть трудно разобраться, пока не наткнетесь на что-то, что естественно. В какой-то момент я заново изобрел половину Control.Arrow (плохо) во время написания интерактивных состояний машин с обратной связью.

  • Вы не упомянули об этом, но часто недооцененный, мощный класс типа - скромный Monoid. Есть много мест, где можно найти моноидоподобную структуру. Посмотрите на пакет моноидов, например.


Помимо классов классов, я бы предложил очень простой ответ на ваш вопрос: Написать программы! Лучший способ учиться - это сделать, поэтому выберите что-нибудь интересное или полезное и просто сделайте это.

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

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

Ответ 3

Typeclasses, такие как Monad, Applicative, Arrow, Functor, являются большими и все более важными для изменения того, как вы думаете о коде, чем необходимость в удобстве создания общих функций над ними. Но есть общее заблуждение, что "следующий шаг" в Haskell узнает о более типичных классах и способах структурирования потока управления. Следующий шаг заключается в том, чтобы решить, что вы хотите написать, и попытаться написать его, исследуя, что вам нужно на этом пути.

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

Посмотрите на логику или математические проблемы и изучите способы внедрения backtracking - сначала глубину, ширину и т.д. Изучите разницу между ListT и LogicT и ChoiceT. Взгляните на продолжение.

Или сделай что-то совершенно другое!

Ответ 4

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

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

Ответ 5

Начните писать код. Вы узнаете необходимые концепции, когда идете.

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

  • Cabal, инструмент для управления зависимостями, сборки и развертывания приложений Haskell *.
  • FFI (интерфейс внешних функций) для использования библиотек C из вашего кода Haskell **.
  • Hackage как источник других библиотек.
  • Как профиль и оптимизация.
  • Автоматические рамки тестирования (QuickCheck, HUnit).

*)cabal-init помогает быстро запустить.

**) В настоящее время мой любимый инструмент для привязок FFI - bindings-DSL.

Ответ 6

Как один следующий шаг (а не полдюжины "следующих шагов" ), я предлагаю вам научиться писать собственные классы типов. Вот несколько простых проблем, которые помогут вам начать:

  • Написание некоторых интересных экземпляров для QuickCheck. Скажем, например, что вы хотите генерировать случайные деревья, которые каким-то образом "интересны".

  • Переходите к следующей небольшой проблеме: определите функции /\, \/ и complement ( "и", "или" и "не" ), которые могут применяться не только к Booleans а к предикатам произвольной сущности. (Если вы внимательно посмотрите, вы можете найти ответ на этот вопрос на SO.)

Ответ 7

Вы знаете все, что вам нужно, чтобы идти вперед и писать код. Но если вы хотите узнать больше о Haskell-y, о чем я могу посоветовать:

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


data TTrue = TTrue
data FFalse = FFalse

class TypeLevelIf tf a b where type If tf a b weirdIfStatement :: tf → a → b → tf a b

instance TypeLevelIf TTrue a b where type If TTrue a b = a weirdIfStatement TTrue a b = a

instance TypeLevelIf FFalse a b where type If FFalse a b = b weirdIfStatement FFalse a b = a

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

Если вам интересно о программировании на уровне типа, типы семейств предоставляют один аспект в этой теме.

  • Шаблон Haskell. Это огромный вопрос. Это дает вам силу, похожую на макросы в C, но с гораздо большей безопасностью типов.

  • Узнайте о некоторых из ведущих библиотек Haskell. Я не могу подсчитать, сколько раз parsec позволял мне быстро писать безумно полезную утилиту. dons периодически публикует список популярных библиотек для взлома; проверьте его.

Ответ 9

Напишите компилятор haskell: -).