我们从范畴论中知道,并非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 仿函数但在Set中分解?