Описание тега tagless-final

Этот подход является альтернативой традиционному кодированию объектного языка как (обобщенного) алгебраического типа данных.

Типизированный окончательный стиль (он же tagless-final) - это общий метод встраивания предметно-ориентированных языков (DSL) в типизированный функциональный язык, такой как haskell, ocaml, scala или coq.

Этот подход является альтернативой традиционному кодированию объектного языка как (обобщенного) алгебраического типа данных. Он сосредоточен вокруг интерпретаторов: оценщик, компилятор, частичный оценщик, симпатичный принтер, многопроходный оптимизатор - все это интерпретаторы выражений DSL.

Типизированный финальный подход особенно привлекателен, если DSL для встраивания также типизирован. Затем мы можем представить на основном языке не только термины, но и систему типов (производные типов) DSL. Можно встраивать только хорошо напечатанные термины DSL. Таким образом, средство проверки типов основного языка проверяет - и даже делает выводы для нас - типы DSL. Таким образом, можно встраивать даже DSL с зависимыми от ресурсов типами (аффинными, линейными). Этот подход также статически гарантирует, что все интерпретации - в частности, различные преобразования и оптимизации - сохраняют тип.

Характерной особенностью подхода без тегов-final является расширяемость: в любой момент можно добавить больше интерпретаторов, больше проходов оптимизации и даже больше форм выражений в DSL, повторно используя предыдущие интерпретаторы в том виде, в каком они были. Возможно, это противоречит интуиции, но стиль без тегов-final поддерживает преобразования DSL: от постоянного распространения и частичной оценки до преобразований CPS и обмена циклами.

Типизированный финальный стиль (без тегов)