Введение¶
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)
Архитектура¶
[SOLID == ООП?](https://habr.com/ru/post/509430/)
Абстрактные концепции¶
которые надо разъяснять по ходу дела
reference transparency