Описание тега haskell
Haskell - это чисто функциональный язык программирования. Этот продукт с открытым исходным кодом, в котором были проведены более двадцатилетние исследования, позволяет быстро разрабатывать надежное, краткое и правильное программное обеспечение. Благодаря мощной поддержке интеграции с другими языками, встроенным функциям параллелизма и параллелизма, отладчикам, профилировщикам, богатым библиотекам и активному сообществу Haskell упрощает создание гибкого, удобного в обслуживании и высококачественного программного обеспечения.
Контрольный список
Чтобы не отвечать на одни и те же вопросы снова и снова, просмотрите список интересных вопросов и этот контрольный список:
Смешивание табуляции и пробелов
Очень много ошибок с упоминанием каких-то parse error on input...
вызваны тем, что пользователь смешивает пробелы и табуляции в отступе, поэтому убедитесь, что это не так. Кроме того, вам, вероятно, следует настроить свой редактор для преобразования табуляции в пробелы.
Проблемы с проверкой типов при компиляции
Хотя система типов Haskell очень мощная, ее поведение иногда может сбивать с толку. Чем более явные подписи типов вы добавляете, тем меньше у компилятора возможностей вывести абсурдные отношения. Сигнатуры типов также делают вопросы более понятными, потому что очевидно, что вы хотите, чтобы функция выполняла.
Проблемы с производительностью
В случае проблем с производительностью убедитесь, что вы скомпилировали код с включенной оптимизацией. Проходящий-O2
компилятору устраняет многие проблемы с производительностью. Интерпретатор GHC заметно медленнее, чем запуск двоичного файла, выведенного из компилятора GHC.
Также может быть полезно скомпилировать с -Wall
чтобы наблюдать (среди прочего) места, где числовые типы по умолчанию устанавливаются с произвольной точностью Integer
type, чтобы вы могли подумать, сойдет ли вам с рук использование более эффективной фиксированной точности Int
тип.
Также важно знать, какую версию компилятора и библиотек вы используете. Предоставление этой информации может значительно сократить время, необходимое сообществу, чтобы ответить на ваш вопрос.
Многие проблемы с производительностью новичков возникают из-за неправильного понимания того, что такое списки и как их можно эффективно использовать. В частности, они не являются массивами, но имеют ту же структуру, что и связанные списки в императивных языках:
data List a = Cons a (List a)
| Empty
Понимая это [a]
- вложенный (рекурсивный) алгебраический тип данных, важен для поддержки интуитивного понимания эффективности таких операций, как (:)
против (++)
, (!!)
, length
, так далее.
Идиоматическое и эффективное использование списков предполагает создание таких функций, как zip
, map
, filter
, foldr
, take
и т.д., многие из которых позволяют полностью исключить промежуточные списки.
Прелюдия String
Тип реализован в виде списков:
type String = [Char]
Это очень удобное представление, но оно неэффективно с точки зрения памяти и не подходит для обработки текста, когда производительность является проблемой. Вместо этого text
библиотеку следует использовать.
В bytestring
- это столь же быстрый и эффективный высокоуровневый интерфейс вокруг строки (или потока) байтов. ВData.ByteString.Char8
модуль можно использовать для эффективного представления небольшого подмножества Unicode, например, когда ожидается только текст ASCII.
"Что такое функция foo
/ оператор #$*
?"
Синтаксис Haskell очень прост в том смысле, что все (кроме нескольких ключевых слов) является просто библиотечной функцией 1, включая все инфиксные операторы. Эти функции можно легко найти,
- Hayoo ищет идентификаторы и подписи по всей базе данных Hackage.
- Hoogle также ищет идентификаторы и подписи, но работает только в том случае, если функция поступает из известного пакета.
Пожалуйста, сначала попробуйте эти движки, прежде чем задавать такой или тот или иной вопрос.
"Какую библиотеку я должен использовать для <thing>
?"
Эти типы вопросов обычно не по теме, но вот несколько полезных ресурсов:
- "Состояние Haskell экосистемы" совместный документ
- Просмотр списка пакетов на взлом и просмотр количества загрузок и обратных зависимостей как меры популярности / зрелости.
Начиная
- Загрузите платформу Haskell для своей платформы. Сюда входит современный компилятор Glasgow Haskell (GHC), а также общие инструменты и библиотеки для разработчиков.
- Ознакомьтесь с этими вопросами о переполнении стека со ссылками на популярные веб-сайты и руководства:
- Развлекайтесь и задавайте вопросы!
Интересные вопросы / ответы
- Что такое монада?
- Почему в Haskell побочные эффекты моделируются как монады?
- foldl против поведения foldr с бесконечными списками
- В чем практическое применение аппликативного стиля?
- Haskell: Чем отличаются нестрогий и ленивый?
- Вывод преобразователя монад (ответ на вопрос Могу ли я использовать здесь bind / fmap)
- Сравнение веб-фреймворков Haskell Snap и Yesod
- Асимметрия в функции привязки
- Что делает ключевое слово forall в Haskell/GHC?
- Что такое нормальная форма слабой головы?
- Разница между. (точка) и $ (знак доллара)?
- Крупномасштабный дизайн в Haskell
- Каков статус многоядерного программирования в Haskell?
- Что плохого в Lazy I/O?
- Какие расширения Haskell (GHC) следует использовать / избегать пользователям?
- Объяснение функции обхода в Haskell
- Объяснение функции оценки в Haskell
- Композиция Функция композиции: интуиция за (.).(.)
- Как избавиться от лени во время разработки
- Конфиденциальность функций и модульное тестирование в Haskell
- Объяснение конструктора данных, конструктора типа, переменной типа и видов
- Преимущества аппликативного синтаксического анализа над монадическим
- Объем памяти типов данных Haskell
- Haskell-эквивалент идей ООП
- Рассуждения о ленивых последовательностях
- IO, строгая оценка и WHNF
- Что такое строгость позвоночника
- Теоретическая основа экзистенциальных типов
- Понимание оценки функций в Haskell
- Понимание ленивых вычислений
- линзы, fclabels, data-accessor - в чем отличия
- Объяснение экзистенциальных и универсально определяемых типов в Haskell
- RankNTypes и Polykind
- Алгоритм за pointfree
- Как соотносятся значения в категории Hask
- Почему в Haskell отсутствуют очевидные классы типов?
- Почему списки различий более эффективны, чем обычная конкатенация?
Известные реализации Haskell
- GHC: Glasgow Haskell Compiler, оптимизирующий компилятор для Haskell.
- UHC: реализация Haskell от Утрехтского университета.
- Hugs: некогда популярный интерпретатор Haskell, который больше не поддерживается. Большинство людей сейчас используют GHCi для интерактивной разработки.
Сообщество
Другие места для обсуждения Haskell, помимо формата вопросов и ответов stackru:
- Вики: HaskellWiki
- Списки рассылки: см. Здесь
- Reddit: / r / haskell
- Google+: Сообщество Haskell
- IRC: #haskell на freenode
Бесплатные книги по программированию на Haskell
- Выучите Haskell на благо
- Реальный мир Haskell
- Haskell Wikibook
- Программирование на Haskell
- Параллельное и параллельное программирование на Haskell
- Путь Haskell к логике, математике и программированию
- Реализация языков функционального программирования
Книги по программированию на Haskell
Документы Haskell
Следующий список любезно предоставлен Gangadhar:
- Почему так важно функциональное программирование
- История Haskell
- Смотрите видео на Channel9, относящиеся к FP - хотя и не всегда академические
- Следуйте за LtU
- Вы не читали журнал FP, но в нем может быть полезная информация
- Монада Читатель
- Статья Саймона Пейтона Джонса о составлении контрактов хорошо читается, как и почти все из его статей и статей Филипа Вадлера.
- Typing Haskell in Haskell - реализация базовой системы типов Haskell в Haskell от Саймона Пейтона Джонса
Дополнительная информация
1 Технически правильнее было бы сказать, что все является значением библиотеки, потому что что-то вроде числовой константы илиIO
действие на самом деле не является функцией.