假设我有如下定义(cata
变质在哪里):
type Algebra f a = f a -> a
newtype Fix f = Fx (f (Fix f))
unFix :: Fix f -> f (Fix f)
unFix (Fx x) = x
cata :: Functor f => (f a -> a) -> Fix f -> a
cata alg = alg . fmap (cata alg) . unFix
我想知道是否有某种方法可以修改的定义,cata
以便我可以链接一些对象,例如int
通过它,这样我就可以为 alg 函数中的事物生成唯一的句柄,即“a0”、“a1”、“ a2",...等。
编辑:为了更清楚地说明这一点,我希望能够拥有一些功能cata'
,以便当我有类似于以下定义的东西时
data IntF a
= Const Int
| Add a a
instance Functor IntF where
fmap eval (Const i) = Const i
fmap eval (x `Add` y) = eval x `Add` eval y
alg :: Int -> Algebra IntF String
alg n (Const i) = "a" ++ show n
alg n (s1 `Add` s2) = s1 ++ " && " ++ s2
eval = cata' alg
addExpr = Fx $ (Fx $ Const 5) `Add` (Fx $ Const 4)
run = eval addExpr
然后run
评估为“a0 && a1”或类似的东西,即这两个常量不会被标记为相同的东西。