Если у меня есть значение a: Free[Op, A]
, можно ли «сгладить» структуру a
так, чтобы два Op
s, которые связаны свободной монадией, могут быть свернуты в одну?Оптимизация свободной монады
Контекст: Я хотел бы выполнить это как шаг оптимизации до интерпретации, так как семантика Op
является то, что его операции идемпотентны. Поэтому, если два появляются «в строке», второй может быть исключен бесплатно для семантики программы.
Возможно, это может быть сделано только на уровне переводчика? Это похоже на полезное обобщение. – beefyhalo
Это ограничение реализации Scalaz/cats, вытекающее из нетерпеливой стратегии оценки Scala, а не фундаментального Свободного ограничения. Причина заключается в конструкторе Gosub/FlatMapped, используемом 'FlatMap'' Free' для предотвращения переполнения стека: это делает невозможным дальнейший процесс интроспекции путем переноса вычисления в функцию батута. –