阅读Milewski 的 F-algebra 文章后,我尝试实现它并用于解决实际问题。但是,我似乎无法弄清楚如何为Fix
,
newtype Fix f = Fx { unFix :: f (Fix f) }
cata :: Functor f => (f a -> a) -> Fix f -> a
cata alg = alg . fmap (cata alg) . unFix
例如,假设我这个简单的代数:
data NatF a = Zero | Succ a deriving Eq
type Nat = Fix NatF
现在我尝试实现一个实例Eq
(注意:deriving
不起作用):
instance ??? => Eq (Fix f) where
(==) = ???
这就是我卡住的地方。我该如何填写???
才能使这项工作?这甚至可能吗?