Учебник по Haskell | страница 7



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