【问题标题】:Writing generic instances for Fix/Mu in F-algebras在 F 代数中为 Fix/Mu 编写通用实例
【发布时间】:2014-01-20 15:12:19
【问题描述】:

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

这就是我卡住的地方。我如何填写??? 来完成这项工作?这甚至可以做到吗?

【问题讨论】:

  • 您可能想要专门为 Fix NatF 创建 Eq 实例。

标签: haskell typeclass algebra recursive-datastructures fixpoint-combinators


【解决方案1】:

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

{-# 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

【讨论】:

    猜你喜欢
    • 2018-11-29
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多