Из теории категорий известно, что не все эндофункторы в Set допускают свободную монаду. Канонический контрпример является функтором функций.
Но Haskell может превратить любой функтор в свободную монаду.
data Free f a = Pure a | Free (f (Free f a))
instance Functor f => Monad (Free f) where
return = Pure
Pure a >>= f = f a
Free m >>= f = Free ((>>= f) <$> m)
Что делает эту конструкцию для любого функтора Haskell, но разбивается на Установить?