Spec-Zone.ru › Haskell 9

Добро пожаловать в руководство пользователя GHC

Содержание:

  • 1. Введение
    • 1.1. Получение GHC
    • 1.2. Метаинформация: веб-сайты, списки рассылки и т. д.
    • 1.3. Сообщения об ошибках в GHC
    • 1.4. Политика нумерации версий GHC
    • 1.5. Лицензия Glasgow Haskell Compiler
  • 2. Примечания к выпуску
    • 2.1. Версия 9.12.1
      • 2.1.1. Язык
      • 2.1.2. Компилятор
      • 2.1.3. GHCi
      • 2.1.4. Система выполнения
      • 2.1.5. Cmm
      • 2.1.6. Библиотека base
      • 2.1.7. Библиотека ghc-prim
      • 2.1.8. Библиотека ghc
      • 2.1.9. Библиотека ghc-heap
      • 2.1.10. Библиотека template-haskell
      • 2.1.11. Включенные библиотеки
  • 3. Использование GHCi
    • 3.1. Введение в GHCi
    • 3.2. Загрузка исходных файлов
      • 3.2.1. Модули против имён файлов
      • 3.2.2. Внесение изменений и перекомпиляция
    • 3.3. Загрузка скомпилированного кода
    • 3.4. Интерактивная оценка в командной строке
      • 3.4.1. Действия ввода/вывода в командной строке
      • 3.4.2. Использование do в командной строке
      • 3.4.3. Многострочный ввод
      • 3.4.4. Определения типов, классов и других элементов
      • 3.4.5. Что действительно находится в области видимости в командной строке?
        • 3.4.5.1. Влияние :load на область видимости
        • 3.4.5.2. Управление областью видимости с помощью import
        • 3.4.5.3. Управление областью видимости с помощью команды :module
        • 3.4.5.4. Квалифицированные имена
        • 3.4.5.5. :module и :load
        • 3.4.5.6. Затенение и имя модуля Ghci1
      • 3.4.6. Переменная it
      • 3.4.7. Автоматическое назначение типов в GHCi
        • 3.4.7.1. Интерактивные классы
        • 3.4.7.2. Расширенные правила для объявлений default
      • 3.4.8. Использование пользовательской функции интерактивного вывода
      • 3.4.9. Стеки вызовов в GHCi
    • 3.5. Отладчик GHCi
      • 3.5.1. Точки останова и просмотр переменных
        • 3.5.1.1. Установка точек останова
        • 3.5.1.2. Управление точками останова
      • 3.5.2. Пошаговое выполнение
      • 3.5.3. Вложенные точки останова
      • 3.5.4. Переменная _result
      • 3.5.5. Отслеживание и история
      • 3.5.6. Отладка исключений
      • 3.5.7. Пример: просмотр функций
      • 3.5.8. Ограничения
    • 3.6. Вызов GHCi
      • 3.6.1. Пакеты
      • 3.6.2. Дополнительные библиотеки
    • 3.7. Команды GHCi
    • 3.8. Команды :set и :seti
      • 3.8.1. Параметры GHCi
      • 3.8.2. Установка параметров командной строки GHC в GHCi
      • 3.8.3. Установка параметров только для интерактивной оценки
    • 3.9. Файлы .ghci и .haskeline
      • 3.9.1. Файлы .ghci
      • 3.9.2. Файл .haskeline
    • 3.10. Компиляция в объектный код внутри GHCi
    • 3.11. Запуск интерпретатора в отдельном процессе
      • 3.11.1. Построение внешнего интерпретатора
      • 3.11.2. Запуск интерпретатора на другом хосте
    • 3.12. Построение библиотек GHCi
    • 3.13. Часто задаваемые вопросы и моменты, на которые следует обратить внимание
  • 4. Использование runghc
    • 4.1. Использование
    • 4.2. Флаги runghc
    • 4.3. Флаги GHC
  • 5. Использование GHC
    • 5.1. Использование GHC
      • 5.1.1. Начало работы: компиляция программ
      • 5.1.2. Обзор опций
        • 5.1.2.1. Аргументы командной строки
        • 5.1.2.2. Опции командной строки в исходных файлах
        • 5.1.2.3. Установка опций в GHCi
      • 5.1.3. Динамические и режимные опции
      • 5.1.4. Значимые расширения файлов
      • 5.1.5. Режимы работы
        • 5.1.5.1. Использование ghc --make
        • 5.1.5.2. Протокол GHC Jobserver
        • 5.1.5.3. Несколько основных блоков
        • 5.1.5.4. Режим оценки выражений
        • 5.1.5.5. Режим пакетной компиляции
      • 5.1.6. Опции подробности
      • 5.1.7. Флаги, специфичные для платформы
      • 5.1.8. Haddock
      • 5.1.9. Разные флаги
        • 5.1.9.1. Другие переменные среды
    • 5.2. Предупреждения и проверки корректности
      • 5.2.1. Группы предупреждений
      • 5.2.2. Обращение с предупреждениями как с фатальными ошибками
      • 5.2.3. Отдельные опции предупреждений
    • 5.3. Оптимизация (улучшение кода)
      • 5.3.1. -O*: удобные «пакеты» флагов оптимизации.
      • 5.3.2. -f*: платформонезависимые флаги
    • 5.4. Использование Concurrent Haskell
    • 5.5. Использование SMP-параллелизма
      • 5.5.1. Опции времени компиляции для SMP-параллелизма
      • 5.5.2. Опции RTS для SMP-параллелизма
      • 5.5.3. Советы по использованию SMP-параллелизма
    • 5.6. Справочник по флагам
      • 5.6.1. Опции подробности
      • 5.6.2. Альтернативные режимы работы
      • 5.6.3. Какие фазы запускать
      • 5.6.4. Перенаправление вывода
      • 5.6.5. Сохранение промежуточных файлов
      • 5.6.6. Временные файлы
      • 5.6.7. Поиск импортов
      • 5.6.8. Опции файла интерфейса
      • 5.6.9. Расширенные опции файла интерфейса
      • 5.6.10. Проверка повторной компиляции
      • 5.6.11. Опции интерактивного режима
      • 5.6.12. Пакеты
      • 5.6.13. Опции языка
      • 5.6.14. Предупреждения
      • 5.6.15. Уровни оптимизации
      • 5.6.16. Отдельные оптимизации
      • 5.6.17. Опции профилирования
      • 5.6.18. Опции покрытия программы
      • 5.6.19. Опции препроцессора C
      • 5.6.20. Опции генерации кода
      • 5.6.21. Опции компоновки
      • 5.6.22. Опции плагинов
      • 5.6.23. Замена фаз
      • 5.6.24. Принудительное применение опций к определённым фазам
      • 5.6.25. Платформоспецифические опции
      • 5.6.26. Опции отладки компилятора
      • 5.6.27. Разные опции компилятора
    • 5.7. Опции системного времени выполнения (RTS)
      • 5.7.1. Настройка опций RTS
        • 5.7.1.1. Настройка опций RTS в командной строке
        • 5.7.1.2. Настройка опций RTS во время компиляции
        • 5.7.1.3. Настройка опций RTS с помощью переменной среды GHCRTS
        • 5.7.1.4. «Фишки» для изменения поведения RTS
      • 5.7.2. Разные опции RTS
      • 5.7.3. Опции RTS для управления сборщиком мусора
      • 5.7.4. Опции RTS для создания статистики выполнения
      • 5.7.5. Опции RTS для конкурентности и параллелизма
      • 5.7.6. Опции RTS для профилирования
      • 5.7.7. Отслеживание
      • 5.7.8. Опции RTS для покрытия Haskell-программы
      • 5.7.9. Опции RTS для хакеров, отладчиков и чрезмерно заинтересованных личностей
      • 5.7.10. Получение информации о RTS
    • 5.8. Имена файлов и отдельная компиляция
      • 5.8.1. Файлы исходного кода Haskell
      • 5.8.2. Файлы вывода
      • 5.8.3. Путь поиска
      • 5.8.4. Перенаправление вывода компиляции
      • 5.8.5. Сохранение промежуточных файлов
      • 5.8.6. Перенаправление временных файлов
      • 5.8.7. Другие параметры, связанные с файлами интерфейса
      • 5.8.8. Параметры, связанные с расширенными файлами интерфейса
      • 5.8.9. Проверяющий повторную компиляцию
        • 5.8.9.1. Повторная компиляция для Template Haskell и плагинов
      • 5.8.10. Взаимно рекурсивные модули и файлы hs-boot
      • 5.8.11. Подписи модулей
      • 5.8.12. Использование make
      • 5.8.13. Генерация зависимостей
      • 5.8.14. Модули-сироты и объявления экземпляров
    • 5.9. Пакеты
      • 5.9.1. Использование пакетов
      • 5.9.2. Пакет main
      • 5.9.3. Последствия использования пакетов для языка Haskell
      • 5.9.4. Уточнение и переименование модулей
      • 5.9.5. Базы данных пакетов
        • 5.9.5.1. Переменная среды GHC_PACKAGE_PATH
        • 5.9.5.2. Среды пакетов
      • 5.9.6. Идентификаторы установленных пакетов, зависимости и сломанные пакеты
      • 5.9.7. Управление пакетами (команда ghc-pkg)
      • 5.9.8. Создание пакета из исходного кода Haskell
      • 5.9.9. InstalledPackageInfo: описание пакета
      • 5.9.10. Связывание с библиотеками C++
    • 5.10. Бэкэнды GHC
      • 5.10.1. Генератор кода для нативного кода (-fasm)
      • 5.10.2. Генератор кода для LLVM (-fllvm)
      • 5.10.3. Генератор кода для C (-fvia-C)
      • 5.10.4. Генератор кода для JavaScript
      • 5.10.5. Незарегистрированная компиляция
    • 5.11. Параметры, относящиеся к определённой фазе
      • 5.11.1. Замена программы для одной или нескольких фаз
      • 5.11.2. Принудительное применение параметров к определённой фазе
      • 5.11.3. Параметры, влияющие на препроцессор C
        • 5.11.3.1. Стандартные макросы CPP
        • 5.11.3.2. CPP и пробелы в строках
      • 5.11.4. Параметры, влияющие на препроцессор Haskell
      • 5.11.5. Параметры, влияющие на генерацию кода
      • 5.11.6. Параметры, влияющие на линковку
    • 5.12. Использование динамических библиотек
      • 5.12.1. Создание программ, использующих динамические библиотеки
      • 5.12.2. Динамические библиотеки для пакетов Haskell
      • 5.12.3. Динамические библиотеки, экспортирующие API C
      • 5.12.4. Поиск динамических библиотек во время выполнения
        • 5.12.4.1. Unix
        • 5.12.4.2. Mac OS X
    • 5.13. Отладка компилятора
      • 5.13.1. Вывод промежуточных структур компилятора
        • 5.13.1.1. Фронтенд
        • 5.13.1.2. Проверка типов и переименование
        • 5.13.1.3. Представление ядра и упрощение
        • 5.13.1.4. Представление STG
        • 5.13.1.5. Представление C-
        • 5.13.1.6. Генератор кода LLVM
        • 5.13.1.7. Генератор кода C
        • 5.13.1.8. Генератор кода для нативного кода
        • 5.13.1.9. Генератор кода JavaScript
        • 5.13.1.10. Разнообразные дампы бэкенда
      • 5.13.2. Форматирование дампов
      • 5.13.3. Подавление нежелательной информации
      • 5.13.4. Проверка на непротиворечивость
      • 5.13.5. Проверка на детерминизм
      • 5.13.6. Разное
  • 6. Расширения языка
    • 6.1. Введение
      • 6.1.1. Управление версиями и расширениями
      • 6.1.2. Обзор всех расширений языка
      • 6.1.3. Сводка заимствованного синтаксиса
    • 6.2. Синтаксис
      • 6.2.1. Синтаксис Unicode
      • 6.2.2. Магический хэш
      • 6.2.3. Рекурсивное обозначение do
        • 6.2.3.1. Рекурсивные группы связываемых переменных
        • 6.2.3.2. Обозначение mdo
      • 6.2.4. Применимое обозначение do
        • 6.2.4.1. Строгие шаблоны
        • 6.2.4.2. Моменты, на которые следует обратить внимание
      • 6.2.5. Квалифицированное обозначение do
        • 6.2.5.1. Примеры
      • 6.2.6. Параллельные списочные включения
      • 6.2.7. Обобщенные (похожие на SQL) списочные включения
      • 6.2.8. Включения монады
      • 6.2.9. Перегруженные списки
        • 6.2.9.1. Класс IsList
        • 6.2.9.2. Переопределяемый синтаксис
        • 6.2.9.3. Установка по умолчанию
        • 6.2.9.4. Предположения о будущем
      • 6.2.10. Переопределяемый синтаксис и неявный импорт Prelude
        • 6.2.10.1. Пользовательские модули Prelude с именем Prelude
        • 6.2.10.2. Элементы, не затронутые RebindableSyntax
      • 6.2.11. Постфиксные операторы
      • 6.2.12. Секции кортежей
      • 6.2.13. Lambda-case
      • 6.2.14. Пустые альтернативы case
      • 6.2.15. Многосторонние выражения if
      • 6.2.16. Локальные объявления фиктивности
      • 6.2.17. Более свободный синтаксис для аргументов функций
        • 6.2.17.1. Изменения в грамматике
      • 6.2.18. Типизированные дыры
        • 6.2.18.1. Подходящие значения для дыр
      • 6.2.19. Обозначение стрелок
        • 6.2.19.1. Обозначение do для команд
        • 6.2.19.2. Условные команды
        • 6.2.19.3. Определение собственных управляющих структур
        • 6.2.19.4. Примитивные конструкции
        • 6.2.19.5. Отличия от статьи
        • 6.2.19.6. Переносимость
      • 6.2.20. Лексическое отрицание
    • 6.3. Импорт и экспорт
      • 6.3.1. Скрытие элементов, не экспортируемых импортируемым модулем
      • 6.3.2. Импорты с квалификацией пакета
      • 6.3.3. Безопасные импорты
      • 6.3.4. Явные пространства имен в импорте/экспорте
      • 6.3.5. Запись квалифицированных элементов в постпозитивном виде
    • 6.4. Типы
      • 6.4.1. Типы данных без конструкторов
      • 6.4.2. Контексты типов данных
      • 6.4.3. Инфиксные конструкторы типов, классы и переменные типов
      • 6.4.4. Операторы типов
      • 6.4.5. Свободные псевдонимы типов
      • 6.4.6. Существенно квантифицированные конструкторы данных
        • 6.4.6.1. Зачем существенные?
        • 6.4.6.2. Существенные и классы типов
        • 6.4.6.3. Конструкторы записей
        • 6.4.6.4. Ограничения
      • 6.4.7. Объявление типов данных с явными сигнатурами конструкторов
        • 6.4.7.1. Формальная синтаксис для GADTs
        • 6.4.7.2. Дополнения к синтаксису GADTs
      • 6.4.8. Обобщенные алгебраические типы данных (GADTs)
      • 6.4.9. Семьи типов
        • 6.4.9.1. Семьи данных
        • 6.4.9.2. Семьи псевдонимов
        • 6.4.9.3. Подстановочные знаки в левой части данных и экземпляров семейств типов
        • 6.4.9.4. Связанные данные и типы семейств
        • 6.4.9.5. Импорт и экспорт
        • 6.4.9.6. Семьи типов и объявления экземпляров
        • 6.4.9.7. Инъективные типы семейств
      • 6.4.10. Продвижение типов данных
        • 6.4.10.1. Мотивация
        • 6.4.10.2. Обзор
        • 6.4.10.3. Различие между типами и конструкторами
        • 6.4.10.4. Литералы уровня типов
        • 6.4.10.5. Продвинутые списки и кортежи
        • 6.4.10.6. Продвижение существенных конструкторов данных
        • 6.4.10.7. DataKinds и псевдонимы типов
      • 6.4.11. Уникальный синтаксис для списков и кортежей уровня типов
      • 6.4.12. Объявления данных уровня типов
      • 6.4.13. Полиморфизм видов
        • 6.4.13.1. Обзор полиморфизма видов
        • 6.4.13.2. Обзор Типа-в-Типе
        • 6.4.13.3. Принципы вывода видов
        • 6.4.13.4. Вывод видов в сигнатурах типов
        • 6.4.13.5. Явное квантификация видов
        • 6.4.13.6. Вывод порядка переменных в объявлении типа/класса
        • 6.4.13.7. Полные пользовательские сигнатуры видов и полиморфная рекурсия
        • 6.4.13.8. Самостоятельные сигнатуры видов и полиморфная рекурсия
        • 6.4.13.9. Самостоятельные сигнатуры видов и заголовки объявлений
        • 6.4.13.10. Вывод видов в объявлениях типов данных
        • 6.4.13.11. Вывод видов для объявлений экземпляров data/newtype
        • 6.4.13.12. Вывод видов в объявлениях экземпляров классов
        • 6.4.13.13. Вывод видов в псевдонимах типов и экземплярах семейств типов
        • 6.4.13.14. Вывод видов в замкнутых семействах типов
        • 6.4.13.15. Виды высшего ранга
        • 6.4.13.16. Вид Type
        • 6.4.13.17. Вывод зависимости в объявлениях типов данных
        • 6.4.13.18. Вывод зависимости в пользовательских forall
        • 6.4.13.19. Определение видов по умолчанию без PolyKinds
        • 6.4.13.20. Красивый вывод при наличии полиморфизма видов
        • 6.4.13.21. Виды возврата типа данных
      • 6.4.14. Полиморфизм представлений
        • 6.4.14.1. Полиморфизм легкости
        • 6.4.14.2. Нет переменных или аргументов с полиморфизмом представлений
        • 6.4.14.3. Полиморфные низы представлений
        • 6.4.14.4. Вывод и определение по умолчанию
        • 6.4.14.5. Вывод полиморфных типов представлений
      • 6.4.15. Литералы типов
        • 6.4.15.1. Значения во время выполнения для литералов уровня типов
        • 6.4.15.2. Вычисления с натуральными числами уровня типов
      • 6.4.16. Видимое применение типов
        • 6.4.16.1. Выведенные и указанные переменные типов
        • 6.4.16.2. Порядок указанных переменных
        • 6.4.16.3. Ручное определение выведенных переменных
      • 6.4.17. Абстракции типов
        • 6.4.17.1. Абстракции типов в шаблонах
        • 6.4.17.2. Абстракции типов в функциях
        • 6.4.17.3. Невидимые связывающие переменные в объявлениях типов
        • 6.4.17.4. Дикие связывающие переменные в объявлениях типов
      • 6.4.18. Обязательные аргументы типа
        • 6.4.18.1. Терминология: Зависимый квантификатор
        • 6.4.18.2. Терминология: Видимый квантификатор
        • 6.4.18.3. Связь с TypeApplications
        • 6.4.18.4. Связь с ExplicitNamespaces
        • 6.4.18.5. Типы в терминах
        • 6.4.18.6. Влияние на неявное квантифицирование
        • 6.4.18.7. Связь с Π-типами
      • 6.4.19. Полиморфизм произвольного ранга
        • 6.4.19.1. Примеры
        • 6.4.19.2. Субсупция
        • 6.4.19.3. Вывод типа
        • 6.4.19.4. Неявное квантифицирование
      • 6.4.20. Импредикативный полиморфизм
      • 6.4.21. Линейные типы
        • 6.4.21.1. Выражения
        • 6.4.21.2. Типы данных
        • 6.4.21.3. Вывод типов с множественным полиморфизмом
        • 6.4.21.4. Ограничения
        • 6.4.21.5. Дизайн и дальнейшее чтение
      • 6.4.22. Пользовательские ошибки компиляции во время проверки типов
      • 6.4.23. Отсрочка ошибок типов до выполнения
        • 6.4.23.1. Включение отсрочки ошибок типов
        • 6.4.23.2. Отложенные ошибки типов в GHCi
        • 6.4.23.3. Ограничения отложенных ошибок типов
      • 6.4.24. Роли
        • 6.4.24.1. Номинальные, Представительные и Фантомные
        • 6.4.24.2. Вывод ролей
        • 6.4.24.3. Аннотации ролей
    • 6.5. Записи
      • 6.5.1. Разрешение имён полей записей
      • 6.5.2. Традиционная синтаксическая запись записей
      • 6.5.3. Селекторы полей и TypeApplications
        • 6.5.3.1. Селекторы полей для конструкторов данных в стиле Haskell98
        • 6.5.3.2. Селекторы полей для конструкторов GADT
        • 6.5.3.3. Селекторы полей для псевдонимов шаблонов
      • 6.5.4. Разрешение неоднозначности полей записей
      • 6.5.5. Повторяющиеся поля записей
        • 6.5.5.1. Импорт и экспорт полей записей
      • 6.5.6. Селекторы полей
        • 6.5.6.1. Импорт и экспорт функций-селекторов
      • 6.5.7. Псевдонимы записей
      • 6.5.8. Дикие карты записей
      • 6.5.9. Полиморфизм селектора полей записей
        • 6.5.9.1. Решение ограничений HasField
        • 6.5.9.2. Виртуальные поля записей
      • 6.5.10. Перегруженный оператор точки для записей
      • 6.5.11. Перегруженное обновление записей
    • 6.6. Механизм вывода
      • 6.6.1. Вывод экземпляров для пустых типов данных
      • 6.6.2. Выведенный контекст для вывода экземпляров
      • 6.6.3. Самостоятельные объявления вывода экземпляров
      • 6.6.4. Вывод экземпляров для дополнительных классов (Data, и т.д.)
        • 6.6.4.1. Вывод экземпляров Functor
        • 6.6.4.2. Вывод экземпляров Foldable
        • 6.6.4.3. Вывод экземпляров Traversable
        • 6.6.4.4. Вывод экземпляров Data
        • 6.6.4.5. Вывод экземпляров Typeable
        • 6.6.4.6. Вывод экземпляров Lift
      • 6.6.5. Обобщённые выведенные экземпляры для новых типов
        • 6.6.5.1. Обобщение условия вывода экземпляров
        • 6.6.5.2. Более точное описание
        • 6.6.5.3. Связанные семейства типов
      • 6.6.6. Вывод экземпляров для любого другого класса
      • 6.6.7. Стратегии вывода экземпляров
        • 6.6.7.1. По умолчанию стратегия вывода экземпляров
      • 6.6.8. Вывод экземпляров через
    • 6.7. Шаблоны
      • 6.7.1. Охранники шаблонов
      • 6.7.2. Шаблоны представлений
      • 6.7.3. Шаблоны n+k
      • 6.7.4. Синонимы шаблонов
        • 6.7.4.1. Синонимы шаблонов записей
        • 6.7.4.2. Синтаксис и область действия синонимов шаблонов
        • 6.7.4.3. Импорт и экспорт синонимов шаблонов
        • 6.7.4.4. Типизация синонимов шаблонов
        • 6.7.4.5. Сопоставление синонимов шаблонов
        • 6.7.4.6. Предикаты для синонимов шаблонов
      • 6.7.5. Шаблоны «или»
        • 6.7.5.1. Спецификация
    • 6.8. Объявления классов и экземпляров
      • 6.8.1. Классы типов с несколькими параметрами
      • 6.8.2. Неопределяемые (или рекурсивные) суперклассы
      • 6.8.3. Типы ограниченных методов класса
      • 6.8.4. Значения по умолчанию для сигнатур методов
      • 6.8.5. Подробные требования к значениям по умолчанию для типов
      • 6.8.6. Нульарные классы типов
      • 6.8.7. Функциональные зависимости
        • 6.8.7.1. Правила для функциональных зависимостей
        • 6.8.7.2. Справочная информация по функциональным зависимостям
      • 6.8.8. Объявления и разрешение экземпляров
        • 6.8.8.1. Смягченные правила для заголовка экземпляра
        • 6.8.8.2. Формальный синтаксис для типов объявлений экземпляров
        • 6.8.8.3. Правила завершения экземпляра
        • 6.8.8.4. Неопределяемые экземпляры и циклические суперклассы
        • 6.8.8.5. Перекрывающиеся экземпляры
        • 6.8.8.6. Сигнатуры экземпляров: сигнатуры типов в объявлениях экземпляров
    • 6.9. Литералы
      • 6.9.1. Отрицательные литералы
      • 6.9.2. Двоичные целочисленные литералы
      • 6.9.3. Шестнадцатеричные литералы с плавающей точкой
      • 6.9.4. Целочисленные литералы с дробной частью
      • 6.9.5. Расширенный синтаксис литералов примитивных типов
      • 6.9.6. Подчеркивания в числовых литералах
      • 6.9.7. Перегруженные строковые литералы
      • 6.9.8. Перегруженные метки
      • 6.9.9. Многострочные строковые литералы
        • 6.9.9.1. Примеры
    • 6.10. Ограничения
      • 6.10.1. Смягчение ограничений на контексты классов
      • 6.10.2. Ограничения равенства и ограничение «преобразуемое»
        • 6.10.2.1. Ограничения равенства
        • 6.10.2.2. Неоднородное равенство
        • 6.10.2.3. Неподнятое неоднородное равенство
        • 6.10.2.4. Ограничение Coercible
      • 6.10.3. Вид Constraint
      • 6.10.4. Квантифицированные ограничения
        • 6.10.4.1. Мотивация
        • 6.10.4.2. Изменения в синтаксисе
        • 6.10.4.3. Изменения в типизации
        • 6.10.4.4. Суперклассы
        • 6.10.4.5. Перекрытие
        • 6.10.4.6. Поиск экземпляров
        • 6.10.4.7. Завершение
        • 6.10.4.8. Согласованность
    • 6.11. Типовые подписи
      • 6.11.1. Явное универсальное квантификация (forall)
        • 6.11.1.1. Правило forall-или-ничего
      • 6.11.2. Неоднозначные типы и проверка неоднозначности
      • 6.11.3. Объявления именованных default
        • 6.11.3.1. Указание класса
        • 6.11.3.2. Экспорт значений по умолчанию
        • 6.11.3.3. Определение субординации
        • 6.11.3.4. Правила разрешения неоднозначностей для нескольких объявлений
        • 6.11.3.5. Правила разрешения неоднозначностей в месте использования
      • 6.11.4. Явно-типное квантификация
      • 6.11.5. Лексически отнесенные переменные типов
        • 6.11.5.1. Обзор
        • 6.11.5.2. Типовые подписи объявлений
        • 6.11.5.3. Типовые подписи выражений
        • 6.11.5.4. Типовые подписи шаблонов
        • 6.11.5.5. Объявления классов и экземпляров
      • 6.11.6. Неявные параметры
        • 6.11.6.1. Ограничения типа неявного параметра
        • 6.11.6.2. Связывания неявных параметров
        • 6.11.6.3. Неявные параметры и полиморфная рекурсия
        • 6.11.6.4. Гарантии области видимости неявных параметров
        • 6.11.6.5. Неявные параметры и мономорфизм
      • 6.11.7. Частичные типовые подписи
        • 6.11.7.1. Синтаксис
        • 6.11.7.2. Где они могут появляться?
    • 6.12. Связывания и обобщение
      • 6.12.1. Отключение ограничения мономорфизма
      • 6.12.2. Обобщение let
    • 6.13. Template Haskell
      • 6.13.1. Синтаксис
      • 6.13.2. Использование Template Haskell
      • 6.13.3. Просмотр сгенерированного кода Template Haskell
      • 6.13.4. Пример работы с Template Haskell
      • 6.13.5. Цитаты Template Haskell и пересвязываемый синтаксис
      • 6.13.6. Использование Template Haskell с профилированием
      • 6.13.7. Квазицитирование Template Haskell
    • 6.14. Паттерны bang и Strict Haskell
      • 6.14.1. Паттерны bang
        • 6.14.1.1. Строгие связывания
      • 6.14.2. Типы по умолчанию - строгие
      • 6.14.3. Строгие по умолчанию привязки шаблонов
      • 6.14.4. Модульность
      • 6.14.5. Динамическая семантика паттернов bang
    • 6.15. Параллельное и Конкурентное
      • 6.15.1. Конкурентный и Параллельный Haskell
        • 6.15.1.1. Конкурентный Haskell
        • 6.15.1.2. Параллельный Haskell
        • 6.15.1.3. Аннотирование чистого кода для параллелизма
      • 6.15.2. Память транзакций программного обеспечения
      • 6.15.3. Статические указатели
        • 6.15.3.1. Использование статических указателей
        • 6.15.3.2. Статическая семантика статических указателей
    • 6.16. Неупакованные типы и примитивные операции
      • 6.16.1. Неупакованные типы
      • 6.16.2. Виды неупакованных типов
      • 6.16.3. Неупакованные кортежи
      • 6.16.4. Неупакованные суммы
      • 6.16.5. Неупакованные Newtypes
      • 6.16.6. Неупакованные типы данных
      • 6.16.7. Примитивные строковые литералы
      • 6.16.8. Десугаринг строковых литералов
    • 6.17. Интерфейс внешних функций (FFI)
      • 6.17.1. Отличия GHC от главы FFI
        • 6.17.1.1. Гарантированная безопасность вызовов
        • 6.17.1.2. Взаимодействие между безопасными вызовами и привязанными потоками
        • 6.17.1.3. Varargs не поддерживаются соглашением о вызове ccall
      • 6.17.2. Расширения GHC для главы FFI
        • 6.17.2.1. Неподнятые типы FFI
        • 6.17.2.2. Обёртка newtype для монады IO
        • 6.17.2.3. Явные «forall» в типах внешних функций
        • 6.17.2.4. Примитивные импорты
        • 6.17.2.5. Прерывимые внешние вызовы
        • 6.17.2.6. Соглашение о вызове CAPI
        • 6.17.2.7. hs_thread_done()
        • 6.17.2.8. Эффективное освобождение многих стабильных указателей
      • 6.17.3. Использование FFI с GHC
        • 6.17.3.1. Использование foreign export и foreign import ccall "wrapper" с GHC
        • 6.17.3.2. Использование заголовочных файлов
        • 6.17.3.3. Выделение памяти
        • 6.17.3.4. Многопоточность и FFI
        • 6.17.3.5. Числа с плавающей точкой и FFI
        • 6.17.3.6. Привязанные массивы байтов
    • 6.18. Безопасный Haskell
      • 6.18.1. Использование Безопасного Haskell
        • 6.18.1.1. Строгая безопасность типов (хороший стиль)
        • 6.18.1.2. Создание защищённых систем (ограниченные монады IO)
      • 6.18.2. Безопасный язык
        • 6.18.2.1. Безопасные перекрывающиеся экземпляры
      • 6.18.3. Безопасные импорты
      • 6.18.4. Доверие и режимы Безопасного Haskell
        • 6.18.4.1. Проверка доверия (-fpackage-trust отключено)
        • 6.18.4.2. Проверка доверия (-fpackage-trust включено)
        • 6.18.4.3. Пример
        • 6.18.4.4. Требования к надёжности
        • 6.18.4.5. Доверие к пакетам
      • 6.18.5. Вывод типов Безопасного Haskell
      • 6.18.6. Резюме флагов Безопасного Haskell
      • 6.18.7. Безопасная компиляция
    • 6.19. Разное
      • 6.19.1. Правила переписывания
        • 6.19.1.1. Синтаксис
        • 6.19.1.2. Семантика
        • 6.19.1.3. Как правила взаимодействуют с директивами INLINE/NOINLINE
        • 6.19.1.4. Как правила взаимодействуют с директивами CONLIKE
        • 6.19.1.5. Как правила взаимодействуют с методами классов
        • 6.19.1.6. Слияние списков
        • 6.19.1.7. Специализация
        • 6.19.1.8. Управление происходящим в правилах переписывания
      • 6.19.2. Специальные встроенные функции
      • 6.19.3. Программирование с обобщениями
        • 6.19.3.1. Вывод представлений
        • 6.19.3.2. Написание обобщённых функций
        • 6.19.3.3. Неподнятые типы представлений
        • 6.19.3.4. Обобщённые значения по умолчанию
        • 6.19.3.5. Дополнительная информация
      • 6.19.4. Утверждения
      • 6.19.5. Макрос __GLASGOW_HASKELL_ASSERTS_IGNORED__ CPP
      • 6.19.6. HasCallStack
        • 6.19.6.1. Сравнение с другими источниками стековых следов
      • 6.19.7. Пробелы
    • 6.20. Директивы
      • 6.20.1. Директива LANGUAGE
      • 6.20.2. Директива OPTIONS_GHC
      • 6.20.3. Директива INCLUDE
      • 6.20.4. Директивы WARNING и DEPRECATED
      • 6.20.5. Директива MINIMAL
      • 6.20.6. Директивы INLINE и NOINLINE
        • 6.20.6.1. Директива INLINE
        • 6.20.6.2. Директива INLINABLE
        • 6.20.6.3. Директива NOINLINE
        • 6.20.6.4. Модификатор CONLIKE
        • 6.20.6.5. Управление фазами
      • 6.20.7. Директива OPAQUE
      • 6.20.8. Директива LINE
      • 6.20.9. Директива COLUMN
      • 6.20.10. Директива RULES
      • 6.20.11. Директива SPECIALIZE
        • 6.20.11.1. SPECIALIZE INLINE
        • 6.20.11.2. SPECIALIZE для импортированных функций
      • 6.20.12. Директива SPECIALIZE экземпляра
      • 6.20.13. Директива UNPACK
      • 6.20.14. Директива NOUNPACK
      • 6.20.15. Директива SOURCE
      • 6.20.16. Директивы COMPLETE
      • 6.20.17. Директивы OVERLAPPING, OVERLAPPABLE, OVERLAPS и INCOHERENT
  • 7. Расширение и использование GHC как библиотеки
    • 7.1. Аннотации исходного кода
      • 7.1.1. Аннотирование значений
      • 7.1.2. Аннотирование типов
      • 7.1.3. Аннотирование модулей
    • 7.2. Использование GHC как библиотеки
    • 7.3. Плагины компилятора
      • 7.3.1. Использование плагинов компилятора
      • 7.3.2. Создание плагинов компилятора
      • 7.3.3. Плагины ядра более подробно
        • 7.3.3.1. Управление связываниями
        • 7.3.3.2. Плагины с опозданием
        • 7.3.3.3. Использование аннотаций
      • 7.3.4. Плагины проверки типов
        • 7.3.4.1. Решение ограничений с помощью плагинов
        • 7.3.4.2. Переопределение типов семейств с помощью плагинов
      • 7.3.5. Плагины исходного кода
        • 7.3.5.1. Представление разбора
        • 7.3.5.2. Представление после проверки типов
        • 7.3.5.3. Вычисленный код
        • 7.3.5.4. Файлы интерфейса
        • 7.3.5.5. Пример плагина исходного кода
      • 7.3.6. Плагины подстановки дыр
        • 7.3.6.1. Плагины подстановки дыр с состоянием
        • 7.3.6.2. Пример плагина подстановки дыр
      • 7.3.7. Плагины по умолчанию
      • 7.3.8. Управление повторной компиляцией
      • 7.3.9. Плагины фронтенда
      • 7.3.10. Плагины DynFlags
    • 7.4. Ссылка на бэкэнды
      • 7.4.1. Клиентский код, который только называет бэкэнды
      • 7.4.2. Клиентский код, который различает бэкэнды
      • 7.4.3. Общая стратегия миграции клиентского кода
  • 8. Профилирование
    • 8.1. Центры затрат и стеки центров затрат
      • 8.1.1. Вставка центров затрат вручную
      • 8.1.2. Правила распределения затрат
    • 8.2. Профилирование и внешние вызовы
    • 8.3. Параметры компилятора для профилирования
      • 8.3.1. Автоматическое размещение центров затрат
    • 8.4. Профилирование времени и распределения
      • 8.4.1. Формат профиля JSON
      • 8.4.2. Формат профиля Eventlog
    • 8.5. Профилирование использования памяти
      • 8.5.1. Параметры RTS для профилирования кучи
      • 8.5.2. Профилирование ссылок
        • 8.5.2.1. Подсказки по использованию профилирования ссылок
      • 8.5.3. Точный анализ ссылок
      • 8.5.4. Биографическое профилирование
      • 8.5.5. Фактическое время нахождения в памяти
    • 8.6. hp2ps – Визуализация профилей кучи в PostScript
    • 8.7. Профилирование параллельных и конкурентных программ
    • 8.8. Наблюдение за покрытием кода
      • 8.8.1. Небольшой пример: Взаимная компенсация
      • 8.8.2. Опции для инструментирования кода для покрытия
      • 8.8.3. Набор инструментов hpc
        • 8.8.3.1. hpc report
        • 8.8.3.2. hpc markup
        • 8.8.3.3. hpc sum
        • 8.8.3.4. hpc combine
        • 8.8.3.5. hpc map
        • 8.8.3.6. hpc overlay и hpc draft
      • 8.8.4. Ограничения и недостатки покрытия кода программ на Haskell
    • 8.9. Использование профилирования «ticky-ticky» (для разработчиков)
      • 8.9.1. Дополнительные флаги Ticky
      • 8.9.2. Понимание вывода профилей Ticky-Ticky
      • 8.9.3. Информация о счётчиках, связанных с именами
      • 8.9.4. Примеры
      • 8.9.5. Примечания о профилировании с использованием Ticky
  • 9. Отладка скомпилированных программ
    • 9.1. Руководство
    • 9.2. Запрос трассировки стека из кода Haskell
    • 9.3. Запрос трассировки стека с помощью SIGQUIT
    • 9.4. Примечания разработчика: Аннотации DWARF
      • 9.4.1. Сущности отладочной информации
        • 9.4.1.1. DW_TAG_ghc_src_note
    • 9.5. Дополнительная литература
    • 9.6. Прямое отображение
    • 9.7. Запрос карты таблицы информации
  • 10. Что делать, если что-то идет не так
    • 10.1. Когда компилятор «делает неправильные вещи»
    • 10.2. Когда ваша программа «делает неправильные вещи»
  • 11. Подсказки
    • 11.1. Быстрее: создание программы быстрее
    • 11.2. Быстрее: создание программы, которая работает быстрее
    • 11.3. Меньше: создание программы, которая меньше
    • 11.4. Экономичнее: создание программы, которая потребляет меньше памяти кучи
    • 11.5. Управление инлайнингом с помощью флагов оптимизации.
      • 11.5.1. Развертывание создания
      • 11.5.2. Решения об инлайнинге
      • 11.5.3. Инлайнинг обобщений
    • 11.6. Управление специализацией
      • 11.6.1. Распространённые комбинации флагов/псевдокоманд
      • 11.6.2. Развертываемость
      • 11.6.3. Когда GHC генерирует специализации
    • 11.7. Понимание того, как использование памяти ОС соответствует активным данным
  • 12. Другие утилиты Haskell
    • 12.1. «Yacc для Haskell»: happy
    • 12.2. Создание интерфейсов Haskell для кода C: hsc2hs
      • 12.2.1. Синтаксис командной строки
      • 12.2.2. Синтаксис ввода
      • 12.2.3. Пользовательские конструкции
      • 12.2.4. Кросс-компиляция
  • 13. Запуск GHC на системах Win32
    • 13.1. Запуск GHC на платформах Windows
    • 13.2. Запуск GHCi на Windows
    • 13.3. Взаимодействие с терминалом
    • 13.4. Отличия в поведении библиотек
    • 13.5. Пути к файлам в Windows
    • 13.6. Использование GHC (и других исполняемых файлов, скомпилированных GHC) с Cygwin
      • 13.6.1. Общие сведения
      • 13.6.2. Проблема
      • 13.6.3. Действия
    • 13.7. Создание и использование Win32 DLL
      • 13.7.1. Создание DLL
      • 13.7.2. Создание DLL для вызова из других языков
        • 13.7.2.1. Использование из VBA
        • 13.7.2.2. Использование из C++
  • 14. FFI и JavaScript Backend
    • 14.1. Типы JavaScript FFI
      • 14.1.1. JSVal
      • 14.1.2. JavaScript Callbacks
      • 14.1.3. Callbacks как внешние экспорты
    • 14.2. Создание замен для библиотек с функциями C FFI
      • 14.2.1. Прямая реализация импортов C FFI в JavaScript как jsbits
      • 14.2.2. Создание JavaScript функций, учитывающих NodeJS и браузер
      • 14.2.3. Замена импортов C FFI чистым Haskell и JavaScript
    • 14.3. Связывание с C-источниками
      • 14.3.1. EMCC директивы
      • 14.3.2. Обёртки
      • 14.3.3. Callbacks
  • 15. Использование GHC WebAssembly backend
    • 15.1. Что означает WebAssembly “backend”
    • 15.2. Настройка GHC wasm backend
    • 15.3. Использование GHC wasm backend для компиляции и линковки кода
    • 15.4. Запуск выходных данных GHC wasm backend
    • 15.5. JavaScript FFI в wasm backend
      • 15.5.1. Маршализуемые типы и JSVal
      • 15.5.2. Внешние импорты
      • 15.5.3. Внешние экспорты
      • 15.5.4. Обнаружение использования JSFFI
      • 15.5.5. Взаимодействие с асинхронными исключениями
      • 15.5.6. Взаимодействие с C FFI
      • 15.5.7. JavaScript API
  • 16. Известные ошибки и неточности
    • 16.1. Стандарты Haskell против Glasgow Haskell: несоответствие языка
      • 16.1.1. Расхождения с Haskell 98 и Haskell 2010
        • 16.1.1.1. Лексический синтаксис
        • 16.1.1.2. Контекстно-свободный синтаксис
        • 16.1.1.3. Выражения и шаблоны
        • 16.1.1.4. Шаблоны с ошибками
        • 16.1.1.5. Проверка типов рекурсивных групп связывания
        • 16.1.1.6. Заголовки модулей по умолчанию с -main-is
        • 16.1.1.7. Система модулей и файлы интерфейсов
        • 16.1.1.8. Числа, базовые типы и встроенные классы
        • 16.1.1.9. Поддержка в Prelude
        • 16.1.1.10. Интерфейс внешних функций
      • 16.1.2. Интерпретация GHC неопределенного поведения в Haskell 98 и Haskell 2010
    • 16.2. Известные ошибки или неточности
      • 16.2.1. Ошибки в GHC
      • 16.2.2. Ошибки в GHCi (интерактивная GHC)
  • 17. Форматы журналов событий
    • 17.1. Формат журнала событий
    • 17.2. Диагностика системы выполнения
      • 17.2.1. Наборы возможностей
      • 17.2.2. Информация об окружении
      • 17.2.3. События потоков и планирования
      • 17.2.4. События сборщика мусора
      • 17.2.5. События и статистика кучи
      • 17.2.6. События Spark
      • 17.2.7. События возможностей
      • 17.2.8. События задач
      • 17.2.9. События трассировки
    • 17.3. Вывод журнала событий профилировщика кучи
      • 17.3.1. Типы событий метаданных
        • 17.3.1.1. Начало потока образцов
        • 17.3.1.2. Определения центров затрат
        • 17.3.1.3. Определения происхождения таблицы информации
        • 17.3.1.4. Типы событий образцов
        • 17.3.1.5. Разбиение по центрам затрат
        • 17.3.1.6. Разбиение строк
    • 17.4. Вывод журнала событий профилировщика времени
      • 17.4.1. Событие начала профилирования
      • 17.4.2. Событие образца профилирования
    • 17.5. Событие образца биографического профиля
    • 17.6. Вывод событий неперемещающегося сборщика мусора
      • 17.6.1. Перепись неперемещаемой кучи
      • 17.6.2. Счётчики Ticky
  • 18. Словарь терминов
  • 19. Уход и содержание руководства пользователя GHC
    • 19.1. Основы
      • 19.1.1. Заголовки
      • 19.1.2. Форматирование кода
        • 19.1.2.1. Haskell
        • 19.1.2.2. Другие языки
      • 19.1.3. Ссылки
        • 19.1.3.1. Внутри руководства пользователя
        • 19.1.3.2. К ресурсам GHC
        • 19.1.3.3. К внешним ресурсам
        • 19.1.3.4. К документации Haddock для основных библиотек
        • 19.1.3.5. Математика
      • 19.1.4. Записи индекса
    • 19.2. Цитаты
    • 19.3. Предупреждения
    • 19.4. Документирование опций командной строки и команд GHCi
      • 19.4.1. Опции командной строки
      • 19.4.2. Команды GHCi
    • 19.5. Стилистические соглашения
    • 19.6. Справочные материалы reST

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.12.1/docs/users_guide/index.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API