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

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

Контрольный список

Чтобы не отвечать на одни и те же вопросы снова и снова, проверьте список интересных вопросов и этот контрольный список:

Смешивание табуляции и пробелов

Много ошибок, в которых упоминается какой-то parse error on input..., вызвано тем, что пользователь смешивает пробелы и вкладки в отступе, поэтому убедитесь, что это не так. Кроме того, вам, вероятно, следует настроить редактор для преобразования вкладок в пробелы.

Проблемы проверки типов при компиляции

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

Проблемы с производительностью

В случае проблем с производительностью убедитесь, что вы компилируете свой код с включенной оптимизацией. Передача -O2 компилятору устраняет многие проблемы с производительностью. Интерпретатор GHC заметно медленнее, чем исполняемый двоичный файл, выводимый компилятором GHC.

Также может быть полезно скомпилировать с -Wall, чтобы наблюдать (среди прочих полезных вещей) места, где числовые типы по умолчанию устанавливаются на произвольной точностиInteger, так что вы можете подумать о том, пользуетесь ли вы более эффективным типом Int с фиксированной точностью.

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

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

data List a = Cons a (List a)
            | Empty

Понимание того, что [a] является вложенным (рекурсивным) алгебраическим типом данных, важно для поддержки интуиции для эффективности таких операций, как (:) против (++), (!!), {{X4} }, так далее.

Идиоматическое и эффективное использование списков включает в себя составление таких функций, как zip, map, filter, foldr, take и т. Д., Многие из которых позволяют использовать промежуточные списки, которые должны быть полностью удалены.

Тип Prelude String реализован в виде списков:

type String = [Char]

Это очень удобное представление, но оно довольно неэффективно в памяти и не подходит для обработки текста, где важна производительность. Вместо этого следует использовать text.

bytestring- это такой же быстрый и эффективный высокоуровневый интерфейс вокруг строки (или потока) байтов. Модуль Data.ByteString.Char8 может использоваться для эффективного представления небольшого подмножества юникода, например, когда ожидается только текст ASCII.

"Что такое функция foo / operator #$*?"

Синтаксис языка Haskell очень прост в том смысле, что все (кроме нескольких ключевых слов) - это просто библиотечная функция 1 , включая все инфиксные операторы. Эти функции можно легко найти,

  • Hayooищет идентификаторы и подписи во всей базе данных Hackage.
  • Hoogleтакже выполняет поиск идентификаторов и подписей, но работает только тогда, когда функция поступает из известного пакета.

Пожалуйста, сначала попробуйте эти механизмы, прежде чем задать вопрос, например, этотили thisили это.

"Какую библиотеку мне использовать для <thing>?"

Эти типы вопросов, как правило, не по теме, но вот некоторые полезные ресурсы:

Начиная

  1. Загрузите платформу Haskellдля своей платформы. Это включает в себя современный Glasgow Haskell Compiler (GHC) и распространенные инструменты разработчика и библиотеки.
  2. Ознакомьтесь с этими вопросами переполнения стека со ссылками на популярные веб-сайты и учебные пособия:
  3. Веселитесь и задавайте вопросы!

Интересные вопросы / ответы

Известные реализации на Haskell

  • GHC: Glasgow Haskell Compiler, оптимизирующий компилятор для Haskell.
  • UHC: реализация Haskell из Утрехтского университета.
  • Hugs: когда-то популярный интерпретатор Haskell, который больше не поддерживается. Большинство людей сейчас используют GHCi для интерактивной разработки.

Сообщество

Другие места для обсуждения Haskell, помимо формата вопросов и ответов Stack Overflow:

Бесплатные книги по программированию на Haskell

Книги программирования на Haskell

Документы на Haskell

Следующий список любезно предоставлен Гангадхаром:

  1. Почему функциональное программирование имеет значение
  2. История Хаскелла
  3. Смотрите видео на канале 9, связанном с ФП - хотя и не всегда академическим
  4. Следуйте LtU
  5. Не читал журнал FP, но он может быть полезен для вас
  6. Monad Reader
  7. Статья о составлении договоров Симона Пейтона Джонс хорошо читал, как и почти все из его статей. и это Филиппа Уодлера.
  8. Печатание на Haskell в Haskell- реализация базовой системы типов Haskell в Haskell от Саймона Пейтона Джонса

Больше информации


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