我们从类别理论中知道,并非Set中的所有endofunctors都承认一个免费的monad.规范的反例是powerset仿函数.
但是Haskell可以将任何仿函数变成一个免费的monad.
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中分解?