Skip to content

Latest commit

 

History

History
203 lines (141 loc) · 18.2 KB

Разобрать и сделать задачи.md

File metadata and controls

203 lines (141 loc) · 18.2 KB

Производительность

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

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

Ресурсы

Общий

Профилирование

Тематические исследования

Структуры данных

Выбор структуры данных определяется свойствами ваших данных и используемыми алгоритмами.

Односвязные списки — довольно распространенная структура данных в Haskell. Из-за их простоты и синтаксического сахара они используются повсеместно — часто, когда они не являются хорошим выбором.

Списки хороши для:

  1. Вам нужно только добавить или взять начало списка (consing), что составляет O (1)
  2. Вы используете map, filter, zip и folds, которые в любом случае имеют значение O(N) и подлежат операции слияния (иначе.map f . map g = map (f . g)
  3. Ваш список действительно мал, и ожидается, что он не будет расти.
  4. Ваш список бесконечен

Списки не годятся, если:

  1. Вы используете lookup- используйтеMap
  2. Вы хотите, чтобы элементы были уникальными - используйтеSet
  3. Вы ожидаете, что список будет иметь хотя бы один аргумент, используйтеNonEmpty
  4. Вы используете append или concat, используйте DListилиSeq
  5. Вы используете сортировку с неуникальными значениями, используйтеSeq

Преобразователи монад

Обзор

Функторы и аппликативные интерфейсы могут быть легко составлены , но монады — нет.

Преобразователи монад - это способ объединить возможности монадического интерфейса нескольких типов в один тип.

Упражнения

  • К вашему калькулятору RPN REPL:
    • Используется Eitherдля преждевременного прекращения вычисления выражения при обнаружении ошибок.
    • Добавьте Readerинтерфейс для потоковой оценки встроенных операций.
    • Добавить возможность для пользователя определять новые слова (с синтаксисом: : <word> <expressions>)

Языковые расширения GHC

Haskell — стандартизированный язык программирования. Последний стандарт — Haskell 2010 . GHC, самый популярный компилятор Haskell, содержит больше функций, чем доступно в Haskell 2010. Чтобы использовать эти функции, мы должны сообщить компилятору, что мы хотим их использовать. Мы делаем это, вызывая флаг компилятора или добавляя LANGUAGEпрагму в начало исходного файла.

Функциональные шаблоны

Эффективный внешний слой, неэффективное ядро

Код, который не дает никаких эффектов, легче тестировать, отлаживать и анализировать.

Сохранение большей части логики нашей программы неэффективной делает ее более гибкой.

Но программам по-прежнему необходимо взаимодействовать с внешним миром.

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

Обратите внимание на этот шаблон в этих основных примерах Haskell .

Создавайте из маленьких вещей большие вещи

Шаблоны классов типов

MonoidТакие классы типов , как FunctorApplicativeи , Monadможно рассматривать как шаблоны. Они окружают нас повсюду и лежат в основе API многих библиотек.

Вы можете найти их при веб-разработке, потоковой передаче, вводе-выводе, параллелизме, синтаксическом анализе, обработке ошибок, тестировании, сборке систем и многом другом.

Примеры:

Разобрать, не проверять

Более

Более

Практические руководства

Идеи проекта

  • Кодер/декодер азбуки Морзе
  • Читатель файлов
  • По сети игра камень-ножницы-бумага
  • Калькулятор RPN
  • Преобразователь уценки (подмножества) в HTML
  • Близнецы сервер _
  • Печенье кликер
  • Чат-сервер и клиент
  • Сайт фотоальбома
  • Клон pastebin
  • игра тетрис
  • Дискорд-бот

Некоторые дополнительные темы

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

Рекомендации

Агрегаторы новостей

Простые примеры программ

Несколько крутых приложений с открытым исходным кодом

Вот несколько классных приложений с открытым исходным кодом, написанных на 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 — язык для живого кодирования паттернов.