Haskell递归方案:使用中间结果标记树

时间:2017-09-09 14:59:43

标签: haskell recursion recursive-datastructures recursion-schemes corecursion

使用cata我可以将AST折叠成结果。使用Cofree,我可以在AST上存储其他注释。如何获取AST并返回带注释的AST,并在每一步中返回结果?

alg :: Term Result -> Result
alg = undefined

run :: Fix Term -> Result
run ast = cata alg ast

run' :: Fix Term -> Cofree Term Result
run' = ???

2 个答案:

答案 0 :(得分:2)

这种修改后的代数是否有效?

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定义。

答案 1 :(得分:0)

如果你只需要一个简单的变形,你可以使用像cataM这样的函数。这允许您折叠monadic值,以便正确排序操作。另外,您不需要编写任何样板来包装F代数。

然后

alg :: Term Result -> Cofree Term Result
alg = undefined

run' :: Fix Term -> Cofree Term Result
run' = cataM alg