Welcome to FP book’s documentation!

Введение

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

Часть 1

Lists

// Subsection // ~~~~~~~~~~

This is a normal reST paragraph that contains several index entries.

Types

// Subsection // ~~~~~~~~~~

You can use backticks for showing highlighted code.

Часть 2

Tansformers

// Subsection // ~~~~~~~~~~

GADTs

// Subsection // ~~~~~~~~~~

Примеры

You can use backticks for showing highlighted code.

Часть 3 (Свалка)

Что добавить

Functor

Alternative

Monad

Final-tagless style

Ввод-вывод

Note

Example: This function is not suitable for sending spam e-mails. You can use backticks for showing highlighted code.

[Beyond Church encoding: Boehm-Berarducci isomorphism of algebraic data types and polymorphic lambda-terms](https://okmij.org/ftp/tagless-final/course/Boehm-Berarducci.html)

А тут мы пишем, что хочется получить

  • Программирование в малом
    • Алгебраические типы
      • Нужные какие-то примеры?

    • upgrade с фантомными типами

    • upgrade c GADT

  • То, что нельзя опустить
    • Хвостовая рекурсия

    • CPS

    • ULC
      • Показать late binding на разных стратегиях

    • property-based testing ?

    • deriving ?

  • DSL
    • различие shallow и deep

    • пример со стэком и окасаки

    • парсеры и принтеры

  • Программирование больших кусков
    • Модули
      • Функторы: показать три вида

    • Final tagless?

    • Расширябельность: объекты, extensible ADT и т.д.

    • Архитектурные паттерны?
      • hash-consing

A cool website

Indices and tables