Опять же, читаешь какой-нибудь пост хаскеллиста, и там: "а теперь мы позовем функцию <такую-то>, потому что это у нас <профунктор|аппликатив|изо|whatever>". Это на первый взгляд только объяснение, а на самом деле стороннему человеку вообще не объяснение
Я согласен с тем, что заменять домен конструкциями из теорката не нужно.
Мне не нравится подход
Free Foo
, где
Foo
- язык бога.
Во-первых, я хочу иметь сумму языков и возможность составом этой суммы манипулировать. Это не бизнес-задача, это то, что мне нужно для выполнения бизнес-задач и внутреннего комфорта. Поэтому
-- reaaly fast because index-tagged!
import "fastsum" Data.Sum
kind Effs :: [* -> *] -> * -> *
type Effs fs a = Free (Sum fs) a
Ну а дальше из всех возможных языков надо устранить нехобходимость работать с продолжениями руками:
import "free" Control.Monad.Codensity
import "fastsum" Data.Sum
kind Effs :: [* -> *] -> * -> *
type Effs fs = Codensity (Free (Sum fs))
И до системы эффектов остаётся один шаг - просунуть финальную монаду во все эффекты параметром.