簡體   English   中英

在F-algebras中編寫Fix / Mu的通用實例

[英]Writing generic instances for Fix/Mu in F-algebras

在閱讀了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
  (==) = ???

這就是我陷入困境的地方。 我怎么填寫??? 使這項工作? 這甚至可能嗎?

我能找到的最簡單的例子就是

{-# 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 (fa)這樣的實例,所以這很好用。

 > Fx Zero == Fx Zero
   True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM