使用cata
我可以将AST折叠到结果。使用Cofree
,我可以在AST上存储其他注释。我该如何在每个步骤的每个步骤中返回带有结果的注释AST?
alg :: Term Result -> Result
alg = undefined
run :: Fix Term -> Result
run ast = cata alg ast
run' :: Fix Term -> Cofree Term Result
run' = ???
此修改的代数是否有效?
alg' :: Term (Cofree Term Result) -> Cofree Term Result
alg' t = alg (fmap extract t) :< t
run' :: Fix Term -> Cofree Term Result
run' ast = cata alg' ast
extract
来自Control.Comonad
。我们在此处使用Cofree Term Result -> Result
类型。它只是返回根部的注释。
fmap extract :: Term (Cofree Term Result) -> Term Result
让我们重复使用以前的alg
定义。
如果您只需要简单的血统,则可以使用cataM
之类的函数。这使您可以折叠单声道值,从而正确订购了操作。另外,您无需写任何样板即可包装F-Algebra。
然后
alg :: Term Result -> Cofree Term Result
alg = undefined
run' :: Fix Term -> Cofree Term Result
run' = cataM alg