Чтобы это было ясно, я не говорю о том, как свободная монада очень похожа на комбинатор исправлений, примененный к функтору, то есть как Free f
в основном неподвижная точка f
. (Не то чтобы это не интересно!)
То, что я говорю, это fixpoints Free, Cofree :: (*->*) -> (*->*)
, то есть функторы f
такие, что Free f
является изоморфным самому f
.
Предыстория: сегодня, чтобы укрепить мое довольно не хватающееся на свободных монадах, я решил просто написать несколько из них для разных простых функторов, для Free
и для Cofree
и посмотреть, какие более известные [co] монады были бы изоморфны. Меня особенно интересовало открытие , что Cofree Empty
изоморфно Empty
(что означает Const Void
, функтор, который отображает любой тип к необитаемым). Хорошо, возможно, это просто глупо - я обнаружил, что если вы положите пустой мусор, вы получите пустой мусор, да! - но эй, это теория категорий, где целые вселенные поднимаются от кажущихся тривиальностей... правильно?
Непосредственный вопрос: если Cofree
имеет такую неподвижную точку, что относительно Free
? Ну, это, конечно, не может быть Empty
, как это не монада. Быстрого подозреваемого было бы рядом, например, Const ()
или Identity
, но no:
Free (Const ()) ~~ Either () ~~ Maybe
Free Identity ~~ (Nat,) ~~ Writer Nat
В самом деле, факт, что Free
всегда добавляет дополнительный конструктор, предполагает, что структура любого функтора, что неподвижная точка должна быть уже бесконечной. Но кажется странным, что если Cofree
имеет такую простую неподвижную точку, Free
должна иметь только более сложную (например, fix-by-construction FixFree a = C (Free FixFree a)
, которую поднимает Reid Barton в комментариях).
Является ли скучная правда только тем, что Free
не имеет "случайной неподвижной точки", и это простое совпадение, что Cofree
имеет одно, или я что-то не хватает?