阅读Milewski's F-algebra article后,我尝试实现它并用于解决实际问题。但是,我似乎无法弄清楚如何为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
(==) = ???
这就是我被困的地方。如何填写???
以使其工作?这甚至可以吗?
答案 0 :(得分:11)
我能找到的最简单的例子就是
{-# LANGUAGE UndecidableInstances, FlexibleContexts #-}
import Data.Function (on)
instance Eq (f (Fix f)) => Eq (Fix f) where
(==) = (==) `on` unFix
我们要求的只是当Fix f
是Eq
的实例时,f (Fix f)
是Eq
的实例。因为一般情况下我们有像Eq a => Eq (f a)
这样的实例,所以这很好用。
> Fx Zero == Fx Zero
True