在F-algebras中编写Fix / Mu的通用实例

时间:2014-01-03 02:08:06

标签: haskell typeclass algebra

阅读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
  (==) = ???

这就是我被困的地方。如何填写???以使其工作?这甚至可以吗?

1 个答案:

答案 0 :(得分:11)

我能找到的最简单的例子就是

{-# LANGUAGE UndecidableInstances, FlexibleContexts #-}
import Data.Function (on)

instance Eq (f (Fix f)) => Eq (Fix f) where
  (==) = (==) `on` unFix

我们要求的只是当Fix fEq的实例时,f (Fix f)Eq的实例。因为一般情况下我们有像Eq a => Eq (f a)这样的实例,所以这很好用。

 > Fx Zero == Fx Zero
   True