52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 5

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 5

Ввод пользователя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

Чтение и запись файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

Ленивое и энергичное чтение файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

Аргументы программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

Вызов других программ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

Случайные значения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

Исключения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

Потоки текстовых данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

8.5 Форточка в мир побочных эффектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

Отладка программ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

8.6 Композиция монад . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

8.7 Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

8.8 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

9 Редукция выражений

136

9.1 Стратегии вычислений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

Преимущества и недостатки стратегий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

9.2 Вычисление по необходимости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

9.3 Аннотации строгости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

Принуждение к СЗНФ с помощью seq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

Функции с хвостовой рекурсией . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

Тонкости применения seq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

Энергичные образцы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Энергичные типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

9.4 Пример ленивых вычислений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

9.5 Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

9.6 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

6

10 Реализация Haskell в GHC

149

10.1 Этапы компиляции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

10.2 Язык STG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

10.3 Вычисление STG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

Куча . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

Стек . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

Правила общие для обеих стратегий вычисления . . . . . . . . . . . . . . . . . . . . . . . . . . 154

Правила для стратегии вставка-вход . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

Правила для стратегии вычисление-применение . . . . . . . . . . . . . . . . . . . . . . . . . . 156

10.4 Представление значений в памяти. Оценка занимаемой памяти . . . . . . . . . . . . . . . . . 156

10.5 Управление памятью. Сборщик мусора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

10.6 Статистика выполнения программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

Статистика вычислителя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

Профилирование функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

Поиск источников внезапной остановки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

10.7 Оптимизация программ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

Флаги оптимизации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

Прагма INLINE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

Прагма RULES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

Прагма UNPACK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

10.8 Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172