1

Если у меня есть значение a: Free[Op, A], можно ли «сгладить» структуру a так, чтобы два Op s, которые связаны свободной монадией, могут быть свернуты в одну?Оптимизация свободной монады

Контекст: Я хотел бы выполнить это как шаг оптимизации до интерпретации, так как семантика Op является то, что его операции идемпотентны. Поэтому, если два появляются «в строке», второй может быть исключен бесплатно для семантики программы.

+0

Возможно, это может быть сделано только на уровне переводчика? Это похоже на полезное обобщение. – beefyhalo

+1

Это ограничение реализации Scalaz/cats, вытекающее из нетерпеливой стратегии оценки Scala, а не фундаментального Свободного ограничения. Причина заключается в конструкторе Gosub/FlatMapped, используемом 'FlatMap'' Free' для предотвращения переполнения стека: это делает невозможным дальнейший процесс интроспекции путем переноса вычисления в функцию батута. –

ответ

2

Насколько я понимаю, нет никакой возможности для такого рода интроспекции программы Free Monad, поскольку она представляет собой последовательное вычисление, где каждый шаг зависит от результата другого.

Отличный разговор Джона де Гоеса о преимуществах и недостатках Free Monad vs Free Applicative (https://www.youtube.com/watch?v=H28QqxO7Ihc). Последний дает силу интроспекции.

Смежные вопросы