我有一个我正在使用注释的 AST Cofree
:
data ExprF a
= Const Int
| Add a
a
| Mul a
a
deriving (Show, Eq, Functor)
我type Expr = Fix ExprF
用来表示未标记的 AST,并type AnnExpr a = Cofree ExprF a
表示标记的 AST。我想出了一个函数,通过丢弃所有注释将标记的 AST 转换为未标记的 AST:
forget :: Functor f => Cofree f a -> Fix f
forget = Fix . fmap uncofree . unwrap
这看起来可能是某种变态(我使用的是 Kmett 的recursion-schemes包中的定义)。
cata :: (Base t a -> a) -> t -> a
cata f = c where c = f . fmap c . project
我认为使用 catamorphism 重写的上述内容看起来像这样,但我不知道要放置什么来alg
进行类型检查。
forget :: Functor f => Cofree f a -> Fix f
forget = cata alg where
alg = ???
任何帮助确定这是否真的是 cata/anamorphism,以及为什么它是/不是的一些直觉将不胜感激。