圏論から、 Setのすべての endfunctor が自由なモナドを認めているわけではないことがわかっています。標準的な反例はべき集合関数です。
しかし、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 ファンクターで機能するのに、Setでは機能しない理由は何ですか?