Я постепенно изучал Хаскелл и даже чувствую, что у меня есть мозаика. Тем не менее, еще много экзотических вещей, которые я почти не понимаю, например, Arrows, Applicative и т.д. Хотя я собираю кусочки из кода Haskell, которые я видел, было бы неплохо найти учебник, который действительно объясняет их полностью. (Кажется, что на монадах есть десятки уроков.. но все, кажется, заканчивается прямо после этого!)
Какой следующий шаг к изучению Хаскелла после монад?
Ответ 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 периодически публикует список популярных библиотек для взлома; проверьте его.
Ответ 8
Ответ 9
Напишите компилятор haskell: -).