Haskell может быть быстрым и потреблять мало памяти во многих сценариях, даже если вы используете неизменяемые структуры данных и неэффективный код.
Это хорошая идея, чтобы ваш код был идиоматичным и измерялся, прежде чем вы решите использовать мутацию и другие более причудливые методы. Вам это может не понадобиться!
- Профилирование сборок с помощью стека
- Профилирование и оптимизация
- Утечки пространства в Haskell и обнаружение утечек пространства
- журнал событий2html
- Fast Haskell: конкуренция с C при разборе XML
- Перенос текстовых метрик на чистый Haskell
- О конкуренции с C с помощью Haskell
- wc — подсчет слов с помощью Haskell
- Зима наступает еще быстрее
Выбор структуры данных определяется свойствами ваших данных и используемыми алгоритмами.
Односвязные списки — довольно распространенная структура данных в Haskell. Из-за их простоты и синтаксического сахара они используются повсеместно — часто, когда они не являются хорошим выбором.
Списки хороши для:
- Вам нужно только добавить или взять начало списка (consing), что составляет O (1)
- Вы используете map, filter, zip и folds, которые в любом случае имеют значение O(N) и подлежат операции слияния (иначе.
map f . map g = map (f . g)
- Ваш список действительно мал, и ожидается, что он не будет расти.
- Ваш список бесконечен
Списки не годятся, если:
- Вы используете
lookup
- используйтеMap
- Вы хотите, чтобы элементы были уникальными - используйте
Set
- Вы ожидаете, что список будет иметь хотя бы один аргумент, используйте
NonEmpty
- Вы используете append или concat, используйте
DList
илиSeq
- Вы используете сортировку с неуникальными значениями, используйте
Seq
Функторы и аппликативные интерфейсы могут быть легко составлены , но монады — нет.
Преобразователи монад - это способ объединить возможности монадического интерфейса нескольких типов в один тип.
- Курс Haskell ИТМО на CTD - Лекция 7
- Нежное введение в Monad Transformers
- Школа Haskell - Преобразователи монад
- mtl не является библиотекой преобразования монад
- К вашему калькулятору RPN REPL:
- Используется
Either
для преждевременного прекращения вычисления выражения при обнаружении ошибок. - Добавьте
Reader
интерфейс для потоковой оценки встроенных операций. - Добавить возможность для пользователя определять новые слова (с синтаксисом:
: <word> <expressions>
)
- Используется
Haskell — стандартизированный язык программирования. Последний стандарт — Haskell 2010 . GHC, самый популярный компилятор Haskell, содержит больше функций, чем доступно в Haskell 2010. Чтобы использовать эти функции, мы должны сообщить компилятору, что мы хотим их использовать. Мы делаем это, вызывая флаг компилятора или добавляя LANGUAGE
прагму в начало исходного файла.
Код, который не дает никаких эффектов, легче тестировать, отлаживать и анализировать.
Сохранение большей части логики нашей программы неэффективной делает ее более гибкой.
Но программам по-прежнему необходимо взаимодействовать с внешним миром.
Для этого мы можем создать внешний слой, отвечающий за взаимодействие с пользователем и отправку правильных логических функций.
Обратите внимание на этот шаблон в этих основных примерах Haskell .
Monoid
Такие классы типов , как Functor
, Applicative
и , Monad
можно рассматривать как шаблоны. Они окружают нас повсюду и лежат в основе API многих библиотек.
Вы можете найти их при веб-разработке, потоковой передаче, вводе-выводе, параллелизме, синтаксическом анализе, обработке ошибок, тестировании, сборке систем и многом другом.
Примеры:
- Шаблон проектирования ReaderT
- Обсуждение на Реддите
- Уильям Яо - Абстракции в контексте (книга)
- Алгебра-ориентированный дизайн (книга)
- The Simple Haskell Handbook — создание сервера непрерывной интеграции с нуля (книга)
- Потоковое сжатие Хаффмана в Haskell
- Изучите Haskell, создав генератор блогов
- OpenGL с использованием Haskell
- Компиляция Lisp в JavasScript с нуля в 350 LOC
- Написать вам схему, версия 2
- Создание веб-сайта доски объявлений с помощью Скотти и друзей
- Кодер/декодер азбуки Морзе
- Читатель файлов
- По сети игра камень-ножницы-бумага
- Калькулятор RPN
- Преобразователь уценки (подмножества) в HTML
- Близнецы сервер _
- Печенье кликер
- Чат-сервер и клиент
- Сайт фотоальбома
- Клон pastebin
- игра тетрис
- Дискорд-бот
Они могут быть не так полезны для ваших повседневных задач программирования, но приятно знать, что они существуют, когда они вам нужны.
- Интерфейс внешней функции
- Общее программирование
- Метапрограммирование с помощью шаблона Haskell
- Введение в метапрограммирование классов типов
- Типичная система Haskell — основа для программирования на базовом уровне типов
- Схемы рекурсии
- Линзы
- Основные утилиты Unix в Haskell
- Простой читатель файлов
- Змеиная игра
- Упрощенный веб-интерфейс для cmus
- Сервер изображений
- Минималистичный сайт для обмена ссылками
- Пользовательский интерфейс терминала для общения
- Система непрерывной интеграции
Вот несколько классных приложений с открытым исходным кодом, написанных на Haskell, которые могут принять участие, если вы заинтересованы.
- Aura — менеджер пакетов для Arch Linux и его AUR.
- Bullin-App — приложение для веб-сайта доски объявлений, созданное с помощью Haskell и Скотти.
- CodeWorld — CodeWorld — это образовательная среда, использующая Haskell.
- gifcurry — ваш инструмент для создания видео с открытым исходным кодом в формате GIF, созданный с помощью Haskell.
- Giml — функциональный язык программирования, созданный в прямом эфире.
- Haskell-Poker — покерный сайт, созданный на Haskell.
- hledger - Дружественный, надежный бухгалтерский учет в виде простого текста.
- Komposition — видеоредактор, созданный для скринкастеров.
- Matterhorn — терминальный клиент для чат-системы Mattermost.
- Movie-Monad — бесплатный и простой в использовании видеоплеер, созданный на Haskell.
- нейрон — перспективное приложение командной строки для управления текстовыми заметками Зеттелькастена.
- nyx-game — короткая адская игра, созданная на Haskell.
- patat — Презентации на основе терминала с использованием Pandoc.
- postgrest — REST API для любой базы данных Postgres.
- PureScript — строго типизированный язык, который компилируется в Javascript.
- Project:m36 — движок реляционной алгебры, вдохновленный работами Криса Дейта.
- Taskell — Канбан-доска/управление задачами из командной строки.
- termonad — эмулятор терминала, настраиваемый в Haskell.
- Tidal — язык для живого кодирования паттернов.