免费 Monads 就像固定点

Free 的定义比较一下自己的 Fix

data Free f a = Return a
              | Free (f (Free f a))

newtype Fix f = Fix { unFix::f (Fix f) }

特别是,将 Free 构造函数的类型与 Fix 构造函数的类型进行比较。Free 就像 Fix 一样叠加了一个仿函数,除了 Free 还有一个 Return a 的情况。