[英]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.