Compare the definition of Free
to that of Fix
:
data Free f a = Return a
| Free (f (Free f a))
newtype Fix f = Fix { unFix :: f (Fix f) }
In particular, compare the type of the Free
constructor with the type of the Fix
constructor. Free
layers up a functor just like Fix
, except that Free
has an additional Return a
case.