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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

type String = [Char]

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

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

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

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

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

Пожалуйста, попробуйте эти двигатели, прежде чем задавать вопрос, такой или этот или этот.

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

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

Начиная

  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. Автор Simon Peyton Jones.

Дополнительная информация


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