|
86 | 86 | зависимость такой, какой она вышла: |
87 | 87 |
|
88 | 88 | ``` |
89 | | -1. Параметрический полиморфизм ──→ 3. Монада ──→ 4. форма «в монаде» поверх готовой машины |
| 89 | +1. Параметрический полиморфизм ✅ ──→ 3. Монада и форма «в монаде» ✅ |
90 | 90 | 4. Ввод-вывод (машина продолжений) ✅ ──→ 6. Отказоустойчивость |
91 | 91 | ``` |
92 | 92 |
|
| 93 | +Стрелка «3 → 4» не пригодилась и во второй раз: форма `в монаде` сделана, а |
| 94 | +машина продолжений ввода-вывода на неё НЕ переехала. Причина измерена, а не |
| 95 | +предположена: монада ввода-вывода — это `«Дело» от «А»`, где продолжение стоит |
| 96 | +полем типа `функция из «Отклик» в («Дело» от «А»)`, а форма разворачивает только |
| 97 | +те типы, у которых параметр стоит в поле ЦЕЛИКОМ. Проверено программой: |
| 98 | + |
| 99 | +``` |
| 100 | +FLANG_MONAD монада «Дело»: в варианте «Дальше» параметр «А» стоит внутри поля |
| 101 | + «потом», а не целиком; отображение внутрь применения на месте |
| 102 | + не разворачивается |
| 103 | +``` |
| 104 | + |
| 105 | +Переезд ждёт частичного применения — фазы 4 в `HOF.md`, — и до тех пор |
| 106 | +написанное сегодня продолжает работать, как и обещал пункт 4. |
| 107 | + |
93 | 108 | **1. Параметрический полиморфизм. ✅ СДЕЛАН, включая самоприменение.** Пока его |
94 | 109 | не было, `Возможно` для чисел и для строк были двумя типами с разными именами |
95 | 110 | конструкторов, `M(M)` — третьим, написанным руками, монада не выражалась вовсе, а |
@@ -183,12 +198,41 @@ gcc и clang, Java, Elixir, Rust, Python; Go и .NET на машине нет |
183 | 198 | Осталось: прослеживание тегов по параметрам и частичное применение. |
184 | 199 | Подробности и порядок — `flang/cat/HOF.md`. |
185 | 200 |
|
186 | | -**3. Монада и `в монаде`. 🟢 Разблокирована пунктом (1), форма ещё не сделана.** |
187 | | -Требовала (1): монада — эндофунктор плюс два преобразования, а эндофунктор без |
188 | | -параметра типа не выражался. Теперь выражается — тип, «Обернуть» и «Связать» |
189 | | -проходят все три проверки. Осталась синтаксическая форма `в монаде`. Форма `в монаде` |
190 | | -разворачивается компилятором в вызовы `возврат` и `соединение`; функций первого |
191 | | -класса ей не нужно, потому что тело известно синтаксически. |
| 201 | +**3. Монада и `в монаде`. ✅ СДЕЛАНЫ.** Требовала (1): монада — эндофунктор плюс |
| 202 | +два преобразования, а эндофунктор без параметра типа не выражался. Теперь |
| 203 | +выражается, и на нём сделана форма. |
| 204 | + |
| 205 | +Обещание «разворачивается компилятором в вызовы `возврат` и `соединение`; |
| 206 | +функций первого класса ей не нужно, потому что тело известно синтаксически» |
| 207 | +выполнено буквально — и оказалось не самоочевидным. Связывание требует, чтобы |
| 208 | +продолжение было ЗНАЧЕНИЕМ, а у продолжения есть свободные имена, которые тег |
| 209 | +захватить не умеет (частичного применения нет, `HOF.md`, фаза 4). Выход в том, |
| 210 | +что продолжение не строится вовсе: отображение эндофунктора печатается НА МЕСТЕ, |
| 211 | +`разбор`ом по вариантам типа, и тело стоит прямо в ветви. Свободные имена |
| 212 | +работают, потому что это выражение, а не функция. |
| 213 | + |
| 214 | +Отображение при этом никто не объявляет — компилятор выводит его из устройства |
| 215 | +типа: у полиномиального функтора законное отображение ровно одно. Поэтому |
| 216 | +функториальность ДОКАЗАНА построением, а строки `эндофунктор` в объявлении нет. |
| 217 | + |
| 218 | +Разворачивание сделано внутри разбора, поэтому наружу парсера форма не выходит: |
| 219 | +печать во все восемь целей, анализ завершаемости и обе реализации |
| 220 | +самоприменения получили её даром — `self/parser.flang` и `self/types.flang` не |
| 221 | +потребовали НИ ОДНОЙ правки, в `self/lexer.flang` дописаны только четыре |
| 222 | +поверхности в таблицу слов, потому что таблица сверяется тестом. |
| 223 | + |
| 224 | +Новых ключевых слов четыре: `монада`, `возврат`, `соединение`, `в монаде`; голых |
| 225 | +вхождений в 133 исходниках — ноль, проверено разметкой новым лексером, а не |
| 226 | +только `grep`-ом. Слово `вернуть` отвергнуто измерением: оно стоит голым именем |
| 227 | +в `examples/rosetta/towers-of-hanoi.flang`. |
| 228 | + |
| 229 | +Устройство доказывается сличением объявлений, три закона связывания |
| 230 | +проверяются на сетке из примеров автора с контрпримером в сообщении. По дороге |
| 231 | +нашёлся настоящий дефект — не в монаде, а в выводе типов: ожидание не доезжало |
| 232 | +внутрь аргумента вызова и внутрь поля конструктора, из-за чего блок над |
| 233 | +ДВУХпараметрической монадой не собирался. Починено тремя местами; сверка с |
| 234 | +`self/types.flang` на всём репозитории и на сломанных программах — расхождений |
| 235 | +ноль. Подробности, границы и три измерения про законы — `flang/cat/MONAD.md`. |
192 | 236 |
|
193 | 237 | **4. Ввод-вывод. 🟡 Сделан — но НЕ монадой.** Язык остался чистым: описание |
194 | 238 | действия — обычное значение (`«Поручение»`, пять вариантов, набор закрыт), а |
|
0 commit comments