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

Ресурсы для изучения идиоматического Haskell (сокращение эта, символические инфиксные операторы, библиотеки и т.д.)

Несмотря на некоторый опыт работы с Lisp и ML, у меня много проблем с чтением и (идиоматически) написанием Haskell, потому что локальный стиль выглядит

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

Последнее особенно сложно, потому что существует так много предопределенных операторов, каждый из которых имеет свои собственные условные обозначения и общую семантику, что часто чтение Haskell становится упражнением в Hoogle и :type.

Есть ли хорошие учебные пособия, которые предполагают знание CS/функциональных концепций, а вместо этого сосредотачиваются на иконах, специфичных для Haskell? Я ищу что-то вроде Real-World Haskell, которое начинается с очень наивной, явной программы, а затем постепенно превращает его в более идиоматический стиль, вводя и объясняя идиомы по мере их появления. Но вместо того, чтобы вводить и объяснять общие понятия, такие как монады и типы классов, он вводит конкретные монады и конкретные классы типов, например "но это именно то, что делает альтернативный моноид!"

4b9b3361

Ответ 1

Классы базового типа, такие как Show, Eq и Ord, должны быть легко поняты, прочитав библиотечную документацию, найденную Hoogle и/или Haskell-Language Language Report.

Числовая башня в Haskell кажется запутанной (Int type - это экземпляр классов типа whooping 11 в соответствии с отчетом), но он просто поддерживает все полезные типы чисел и математические представления чисел, изобретенные для нас: например Integer - произвольный размер целого числа, Int - обычное целое число машинного слова, а ленивое представление Пеано целых чисел (не в стандартной библиотеке) оказалось полезным при реализации алгоритмов графа. Наиболее важными классами с числовым типом являются Num и Integral. Вы можете конвертировать между различными целыми типами с помощью функций fromIntegral. Обратите также внимание на то, что цифры, такие как 123, имеют тип Num a => a и специальный механизм по умолчанию, предназначенный для уменьшения необходимости объявления типов, чтобы указать нужный точный нужный тип. В расширенных случаях использования это работает против вас, поэтому вы можете изменить настройки по умолчанию.

То же самое происходит с разными типами строк: ни одно представление не подходит для всех, поэтому многие из них находятся в дикой природе: String, Data.ByteString и Data.Text являются наиболее важными.

Что касается более сложных классов типов, лучшим источником является Typeclassopedia.

Для определенных классов классов, таких как Monad, Applicative и Arrow, существует множество посвященных учебников и исследовательских работ. В зависимости от ваших математических навыков вы также можете ознакомиться с оригинальными исследовательскими работами по концепциям теории категорий, относящимся к типам классов, таким как отличные "понятия вычисления и монады" Эухенио Могги.

Что касается "eta reductions", то он называется Стиль без точек. Вы можете получить информацию от ссылки, упомянутые в этой ссылке. Вы также можете посмотреть Combinatory Logic, документ 1978 года Джона Бэкуса Можно ли освободить программирование от стиля фон Неймана? и язык программирования APL, чтобы получить более богатую историческую перспективу в этом вопросе -бесплатный стиль.

Также есть общие книги по Haskell, такие как "Нежное введение в Haskell" и "Учите вас в Haskell для большого добра".

Как и для приоритета оператора - действительно есть несколько операторов, которые вы должны помнить: (.), ($) и (>>=) используются гораздо больше, чем все остальное (за исключением арифметики конечно, но арифметические операторы довольно неудивительны).

Синтаксис кортежей и списков для меня тоже кажется проблематичным. Это просто избыточно: foo : bar : [] совпадает с [foo, bar] и (,) foo bar совпадает с (foo, bar). Префиксные версии кортежей более высокой степени, такие как (,,,,), редко используются.

См. также http://www.haskell.org/haskellwiki/Section_of_an_infix_operator для объяснения конструкций, таких как (+ 2) и (2 +), называемых разделами.

Также вы можете узнать об изменениях, которые предлагает инструмент HLint для улучшения вашего кода. Исполняемый файл HLint можно установить с помощью cabal install HLint.

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

Ответ 2

Я думаю, что "Напишите себе схему за 48 часов" - это именно то, что вы ищете. В этом руководстве объясняется, как реализовать интерпретатор схемы в Haskell; это один документ, который действительно заставил меня все щелкнуть.

В нем есть конкретные примеры различных идиом и идей Haskell, которые все слились в классный проект. Это особенно хорошо для тех, кто имеет опыт работы в Lisp, особенно если вы читали что-то вроде SICP или ранее реализовали интерпретатор Scheme. Учебник очень хорош в любом случае, но, возможно, вам будет немного легче следовать, если вы уже сделали что-то подобное раньше.