阅读完Milewski的F代数文章后,我尝试实现它并将其用于解决实际问题。 但是,我似乎无法弄清楚如何编写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
(==) = ???
我现在遇到了困难。要如何填写???
才能使这个工作?这样做可能吗?