Введение

Note

Разделять главы на две части: простую и сложную

Вместо предисловия (?)

Что такое ФП вообще? Почему OCaml, а не какой-нить Haskell? На каких примерах надо рассказывать? Будет ли плохо, если книжка превратится в набор рецептов про программирование вообще

//Section //——-

Программирование в малом

Тут байка про перескок с Java на OCaml, и как не очень правильно сравнивать паттерны банды 4х с ADT

Обычные алгебраические типы

  • ПРо енумы из Си

  • [boolean blindeness](https://github.com/quchen/articles/blob/master/algebraic-blindness.md)

  • типы-произведения и структуры

  • discriminated unions (наверное можны забить, так как с-cube мог ошибаться)

  • нормальные алгебраические типы данных

  • Примеры

  • Полезные свойства алгебраических типов: единственность представления

Списки и спископодобные структуры данных

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

  • Списки (‘a list)

  • ПОследовательности отложенных вычислений (‘a seq)

  • Ленивые списки (‘a stream)

Синтаксис и семантика

Примеры где за одинаковым синтаксисом, может стоять разная семантика

  • формулы: (целые числа против нецелых, с бесконечностью и без, целые против битвекторов)

  • языки программирования
    • Сишечка и lexer hack

    • ленивые и не очень

    • смысл синтаксиса JS и отсутствие смысле в других языках

Операционная семантика: интерпретатор

Upgrade: deep embedding, shallow embedding & HOAS

Программирование в целом

Примеры миниязыков

  • парсер-комбинаторы

  • принтер-комбинаторы

  • мэтчинг-комбинаторы

  • Миниязык описания оптимизаций [в компиляторе Go](https://habr.com/ru/post/415771/)

[Combining Deep and Shallow Embedding of Domain-Specific Languages](http://www.cse.chalmers.se/~josefs/publications/deepshallow.pdf)

Архитектура

Абстрактные концепции

которые надо разъяснять по ходу дела

  • reference transparency